定制Wrappanels以拉伸内容

时间:2012-08-14 15:46:01

标签: c# wpf wrappanel

我正在尝试拉伸包装面板中的内容,而不会失去多线的能力。我的意图是,如果内容小于屏幕的宽度,那么它将拉伸任何未定义的内容以填充。这可能吗?它在其他地方完成了吗?

到目前为止我写的代码:

    protected override System.Windows.Size ArrangeOverride(System.Windows.Size finalSize)
    {
        if (this.Children.Count == 0)
            return base.ArrangeOverride(finalSize);
        if (FlexibleColumn == null)
            return base.ArrangeOverride(finalSize);

        double totalWidth = 0;

        for (int i = 0; i > Children.Count; i++)
        {
            if (i == FlexibleColumn)
                continue;
            totalWidth = totalWidth + Children[i].DesiredSize.Width;
        }

        if (totalWidth < finalSize.Width)
        {
            Children[FlexibleColumn].DesiredSize.Width = finalSize.Width - totalWidth;
        }

        return base.ArrangeOverride(finalSize);
    }

然而,孩子只是为了获取,而不是设定。还有其他任何想要操纵它的人吗?

由于

1 个答案:

答案 0 :(得分:0)

有许多自定义包装:( http://www.codeproject.com/Articles/32629/A-better-panel-for-data-binding-to-a-WrapPanel-in

基本上你必须覆盖MeasureOverride方法

提示是设置WrapPanel中存在的ItemWidth属性。例如:

if (Orientation == Orientation.Horizontal)
{
    double supostWidth = 0.0;
    foreach (UIElement el in Children)
    {
       el.Measure(availableSize);
       Size next = el.DesiredSize;
       if (!(Double.IsInfinity(next.Width) || Double.IsNaN(next.Width)))
       {
            supostWidth = Math.Max(next.Width, supostWidth);
       }
    }

    double totalWidth = availableSize.Width;

    if (!double.IsNaN(supostWidth) && !double.IsInfinity(supostWidth) && supostWidth > 0)
    {
        var itemsPerRow = (int)(totalWidth / supostWidth);
        if (itemsPerRow > 0)
        {
            ItemWidth = totalWidth / itemsPerRow;
        }
    }
}