【问题标题】:Dynamic item padding in a WPF WrapPanelWPF WrapPanel 中的动态项填充
【发布时间】:2015-04-01 20:52:19
【问题描述】:

有没有办法根据WrapPanel width 调整 WPF 控件中的填充,就像 Windows Explorer 在调整窗口大小时所做的那样。

这里有几个例子:

【问题讨论】:

标签: c# wpf padding wrappanel


【解决方案1】:

如果您使用 ItemsControl,您可以定义 ItemsContainerStyle 并设置它的 MaxHeight 和 MaxWidth 值。

通过这样做,项目可以增长到有限的大小,并且会出现填充效果。

【讨论】:

  • 这会迫使你使用相同类型的孩子,不是吗?虽然你可以解决这个问题blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/…
  • @Sag1v 根据他展示的图片,这似乎是他所需要的,更多的面向对象编程是关于抽象,他可以为同一个 ItemsControl 下的不同项目使用不同的 DataTemplate。我描述的是一个简单的灵魂,上面瑞秋的回答将是要走的路,我只是不想让 SteelersMan 负担如此先进的解决方案。
  • @Sag1v 不,这适用于可变大小的项目。您只需要确保 ItemTemplate 具有特定的内容大小,因此任何额外的空间都显示为空白。另外,我会使用HeightWidth 而不是MaxHeight/MaxWidth 来确保所有项目的绘制大小相同,并且具有相同数量的空白
【解决方案2】:

我建议使用绑定和转换器设置ItemContainerStyleWidth 属性,以确定每个项目的正确大小。

在您的示例中,您的项目大小似乎是静态的,您只想分配剩余空间,因此将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;
}

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 2011-09-24
    • 2016-03-18
    • 1970-01-01
    • 2012-11-10
    • 2021-04-10
    • 1970-01-01
    • 2012-07-03
    相关资源
    最近更新 更多