0

我需要在列表框和面板之间实现一些东西。它必须有没有自己风格的可绑定项目源。所以我决定从FrameworkElement派生。我试图在我的控件后面的代码中添加新按钮,并在更改 ItemsSource 属性时调用 InvalidateMeasure。在 MeasureOverride 方法中,我运行 itemssource 集合并使用 availableSize 作为每个项目的参数调用 Measure。但结果我得到了itemssouce内控件的奇怪DesiredSize(在我的情况下是按钮) - 16高度和0宽度。这是我的代码:

    // part from usercontrol's code behind  
    public MainPage()
    {
        InitializeComponent();

        dash.ItemsSource.Add(new Button { Content = "button 1 content", Padding = new Thickness(10) });
        dash.ItemsSource.Add(new Button { Content = "button 2 content", Padding = new Thickness(10) });
    }

    //part from my control
    protected override Size MeasureOverride(Size availableSize)
    {
        var desiredSize = new Size();
        foreach (UIElement item in ItemsSource)
        {
            item.Measure(availableSize);
            desiredSize.Height += item.DesiredSize.Height;
            desiredSize.Width += item.DesiredSize.Width;
        }
        return desiredSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {           
        double x = 25, y = 25;
        foreach (FrameworkElement item in ItemsSource)
        {
            item.Arrange(new Rect(x, y, item.DesiredSize.Width, item.DesiredSize.Height));
        }

        return base.ArrangeOverride(finalSize);
    }

我尝试手动设置项目的高度和宽度,但没有帮助。甚至尝试使用 new Size(double.PositiveInfinity,double.PositiveInfinity); 第一次调用 Measure 两次 无论如何,按钮都不想出现在用户控件上。

请帮助我确定我做错了什么!

4

1 回答 1

0

您正在寻找的是派生面板。由于您没有真正解释您想要的布局应该是什么样子,下面的示例通过将每个子项放置在前一个子项的右下角来“对角”排列面板的子项。此外,它忽略任何水平或垂直对齐设置。您可以像使用任何其他 Panel 一样使用它,并在 XAML 或代码中添加子级。

public class MyPanel : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        var infiniteSize = new Size(double.PositiveInfinity, double.PositiveInfinity);

        foreach (UIElement child in Children)
        {
            child.Measure(infiniteSize); // allow unconstrained child size
        }

        return new Size(); // consume as less size as possible
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        var position = new Point();

        foreach (UIElement child in Children)
        {
            var size = child.DesiredSize;
            child.Arrange(new Rect(position, size));
            position.X += size.Width;
            position.Y += size.Height;
        }

        return new Size(position.X, position.Y);
    }
}
于 2013-06-24T12:47:54.597 回答