어쩌면 내가 도와 줄 수 있습니다. 사전과 그 사전에 바인딩 된 ItemsControl이 있습니다. 각 입력의 Key는 ItemsControl의 각 Item의 내용을 결정하고 Value는 각 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 부모를 기준으로합니다.
또 다른 하나 : 각 항목은 행이 아닌 표의 한 열로 간주됩니다. 그래서 모든 항목이 같은 줄에서 서로 옆에 있어야합니다.
솔루션 : 당신의 도움에 대한
덕분에,이 문제는 Multibinding을 사용하고 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에서 그리드를 정의 할 수는 있지만, 각 아이템은 그리드가 작동하지 않을 것입니다. 그렇지 않으면 여기에서 무엇을 감독합니까? – BlackWolf