たぶん、皆さんは私がこれを理解するのを手伝ってくれるかもしれません.Dictionaryと、その辞書にバインドされているItemsControlがあります。各エントリのキーは、ItemsControl 内の各アイテムの内容を決定し、値は各アイテムの幅を決定します。これに関する大きな問題: 幅はパーセンテージ値であるため、たとえば、アイテムのサイズが親の 20% である必要があることがわかります。
どうすればこれを達成できますか?グリッドがスターベースの幅で機能することは知っていますが、グリッドの先頭で 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 つの列であると想定されています。したがって、すべてのアイテムを同じ行に並べる必要があります。
解決策:
ご協力ありがとうございます。この問題は、Multibinding と Binding を ItemsControl の ActualWidth に使用することで解決できます。このように、ItemsControl のサイズが変更されるたびに、Items も変更されます。グリッドは必要ありません。このソリューションは相対的な幅のみを作成しますが、もちろん同じソリューションをアイテムの高さに適用できます。これは短いバージョンです。より完全な説明については、以下を参照してください。
XAML :
<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>
コンバーター:
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();
}
}
そして、それはトリックを行う必要があります!