私は15〜20行あり、それらのいくつかは異なりますが、それらのほとんどは類似しています:
<RowDefinition Height="Auto" />
また、コードの重複は避けたいと思います。これは、1行ずつ約10行になるためです。どのようにそれを行うことができますか?
XAMLを使用しないコードで実行できますが、この問題を解決するのは間違った方法だと思います。
特に、すべてのグリッド行の Height プロパティが「Auto」に設定されているわけではない場合、グリッド行の宣言を簡略化することはできないと思います。hereに示されているように、添付された依存関係プロパティを使用してみることができます。
この例ではグリッド行の数を指定しており、各行の Height プロパティをプログラムで設定していることがわかります。より複雑な方法で、各行に割り当てる高さを決定する必要がある場合があります。このソリューションは XAML でより美しくなる可能性がありますが、実装がより複雑になる可能性があり、各行に適切な高さを割り当てるのに苦労する可能性があります。個人的には、Visual Studio でタグを折りたたむことができるので、各行を宣言する方が簡単に思えます。
これが役立つことを願っています!
単純なカンマ区切りのリストに基づいて行と列を自動的に定義する添付プロパティを提供するクラスを作成することで、以前にこれを解決しました。基本的に行う必要があるのは、添付プロパティを作成することです (私はそれを呼び出してAutoRows
、プロパティが変更されたメタデータのメソッドを定義しました。そのメソッドは値を解析し、単純に新しいRowDefinition
要素を作成します。
コンマ区切りリスト内の各値が 1 つの行に等しい単純な構文を使用しました。したがって20,20,20
、高さで 3 行を作成します20
。高さのある行を許可し、auto
スペースを節約するために、ブロック内に複数の自動行を定義する新しい形式を追加しました。たとえば20,~5,20
、 height で行を定義し20
、次に 5 つの自動行を定義し、最後に高さで別の行を定義し20
ます。
私の変更ハンドラーは基本的にこれを行います:
public static void AutoRowsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
RowDefinitionCollection rows = ((Grid)obj).RowDefinitions;
rows.Clear();
foreach (string segment in ((string)e.NewValue).Split(','))
{
if (segment.StartsWith("~"))
{
int count;
if (!int.TryParse(segment.Substring(1), out count))
count = 1;
for (int i = 0; i < count; i++)
rows.Add(new RowDefinition() { Height = GridLength.Auto });
}
else
{
GridLengthConverter converter = new GridLengthConverter();
rows.Add(new RowDefinition() { Height = (GridLength)converter.ConvertFromString(segment) });
}
}
}
正しく解析され、何も失敗しないことを確認するために、いくつかの行を省略しました。ご覧のとおり、 を使用しGridLengthConverter
て、各非自動値が法線RowDefinition
がサポートする任意の値を受け入れるようにします。したがって、すべての行の高さをコンマで簡単に結合し、それを添付プロパティの値として使用できます。