【发布时间】:2015-04-01 20:52:19
【问题描述】:
有没有办法根据WrapPanel width 调整 WPF 控件中的填充,就像 Windows Explorer 在调整窗口大小时所做的那样。
这里有几个例子:
【问题讨论】:
-
我建议你应用这个答案中的技术:stackoverflow.com/a/932609/970247。
有没有办法根据WrapPanel width 调整 WPF 控件中的填充,就像 Windows Explorer 在调整窗口大小时所做的那样。
这里有几个例子:
【问题讨论】:
如果您使用 ItemsControl,您可以定义 ItemsContainerStyle 并设置它的 MaxHeight 和 MaxWidth 值。
通过这样做,项目可以增长到有限的大小,并且会出现填充效果。
【讨论】:
Height 和Width 而不是MaxHeight/MaxWidth 来确保所有项目的绘制大小相同,并且具有相同数量的空白
我建议使用绑定和转换器设置ItemContainerStyle 的Width 属性,以确定每个项目的正确大小。
在您的示例中,您的项目大小似乎是静态的,您只想分配剩余空间,因此将Width 属性绑定到WrapPanel.Width / NumberOfItems(这是可以放入 WrapPanel 的 ItemWidth 的总数。宽度)
这是一个使用 100 作为项目宽度的快速示例:
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Width"
Value="{Binding ElementName=MyWrapPanel,
Path=ActualWidth,
Converter={StaticResource MyCustomWidthConverter},
ConverterParameter=100" />
</Style>
</ItemsControl.ItemContainerStyle>
转换器看起来像这样(我可能有语法错误,因为我没有使用 IDE 来验证代码):
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
// TODO: add error handling
double totalWidth = (double)value;
double itemWidth = (double)parameter;
double numItems = Math.Floor(totalWidth / itemWidth);
double availableExtraSpace = totalWidth - (numItems * itemWidth);
double paddedItemWidth = itemWidth + (availableExtraSpace / numItems);
return paddedItemWidth;
}
【讨论】: