多分、あなたが私にこれを理解させる手助けをすることができます:私は辞書とその辞書にバインドされているItemsControlを持っています。各エントリのキーはItemsControlの各Itemの内容を決定し、Valueは各Itemの幅を決定します。この大きな問題:幅はパーセンテージの値なので、たとえば、私のItemは親の20%のサイズでなければならないということがわかります。WPFの動的パーセンテージベースの幅
どうすればこの問題を解決できますか? グリッドはスターベースの幅で動作することができますが、グリッドの先頭にGridDefinitionを定義する必要があるため、ItemsControl.ItemTemplateでこれを行うことはできません。
現在のコード:
<ItemsControl ItemsSource="{Binding Distribution}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid IsItemsHost="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- I NEED THIS TO BE A CERTAIN PERCENTAGE IN WIDTH -->
<Label Content="{Binding Key.Text}" Foreground="{Binding Key.Color}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
この上の任意のアイデア?これを解決する上品な方法はありますか?
ありがとうございます!
明確化:パーセンテージは、ItemControls親に基づいているはずです。
もう1つ:各アイテムはグリッドの1つの列であり、行ではありません。だから私はすべてのアイテムが同じ列にお互いにある必要があります。
ソリューション:あなたの助けを
おかげで、この問題は、多を使用してのItemsControlのActualWidthに結合することによって解決することができます。このようにして、ItemsControlのサイズが変わるたびにItemsも変更されます。グリッドは必要ありません。この解決策では、相対的な幅しか作成されませんが、項目の高さに同じ解決策を適用することはもちろん可能です。
<ItemsControl ItemsSource="{Binding Distribution}" Name="itemsControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Key.Text}"
Foreground="{Binding Key.Color}">
<Label.Width>
<MultiBinding Converter="{StaticResource myConverter}">
<Binding Path="Value"/>
<Binding Path="ActualWidth" ElementName="itemsControl"/>
</MultiBinding>
</Label.Width>
</Label>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
コンバータ:
XAML:これは、より完全な説明のために以下の短いバージョンダウンを参照され
class MyConverter : IMultiValueConverter
{
public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
{
//[1] contains the ItemsControl.ActualWidth we binded to, [0] the percentage
//In this case, I assume the percentage is a double between 0 and 1
return (double)value[1] * (double)value[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
をそして、それはトリックを行う必要があります!
どのような親の20%ですか? ItemsControl、Labelなどの親ですか? – jtimperley
「グリッドの始めにGridDefinitionを定義する必要がありますか?」とはどういう意味ですか?代わりに 'DataTemplate'であなたのグリッドを定義することができます - それは' ItemsPanelTemplate'にある必要はありません。 –
こんにちは。私の編集を参照してください、20%はItemControls親(または親ラベル)の20%であるはずです。ラベルの親を両方向にストレッチすることができますので同じです。グリッドの始まりについて:はい、私はDataTemplateでグリッドを定義できますが、各Itemには独自のグリッドがあり、動作しませんか、ここで何かを監視していますか? – BlackWolf