【问题标题】:Panel ArrangeOverride & MeasureOverride Methods面板 ArrangeOverride 和 MeasureOverride 方法
【发布时间】:2013-11-09 18:31:21
【问题描述】:

有人可以为这个功能提供一个简单的例子吗? 我想要实现的是这样的:

当我有 1 个孩子时 - 我想全屏显示;

当我有 2 个孩子时 - 我希望拥有相同的高度和宽度,并在整行中显示每个孩子;

当我有 3 个孩子时,是这样的:

|*************|
|   1  |   2  |
|*************|
|      3      |
|*************|

当我有 4 个孩子时:

|*************|
|   1  |   2  |
|*************|
|   3  |   4  |
|*************|

我怎样才能做到这一点?

问候。

编辑 1:我认为这个面板可以继承 UniformGrid somwhow。

【问题讨论】:

  • 标题不适合你的问题。也许Custom a smart layout panel by children's count是个不错的选择。

标签: c# wpf panel


【解决方案1】:

您似乎不需要覆盖MeasureOverride,因为您的面板将占用所有可用空间,因此您只需在ArrangeOverride 中实现您的放置逻辑,如下所示:

public class CustomPanel : Panel
{
    protected override Size ArrangeOverride(Size finalSize)
    {
        if (Children.Count == 1)
        {
            Children[0].Arrange(new Rect(new Point(0, 0), finalSize));
        }
        else if (Children.Count == 2)
        {
            var halfFinalSize = new Size(finalSize.Width, finalSize.Height/2);
            Children[0].Arrange(new Rect(new Point(0, 0), halfFinalSize));
            Children[1].Arrange(new Rect(new Point(0, finalSize.Height / 2), halfFinalSize));
        }
        else if (Children.Count == 3)
        {
            var halfFinalSize = new Size(finalSize.Width, finalSize.Height / 2);
            var quarterSize = new Size(finalSize.Width / 2, finalSize.Height / 2);

            Children[0].Arrange(new Rect(new Point(0, 0), halfFinalSize));
            Children[1].Arrange(new Rect(new Point(0, finalSize.Height / 2), quarterSize));
            Children[2].Arrange(new Rect(new Point(finalSize.Width / 2, finalSize.Height / 2), quarterSize));
        }
        else if (Children.Count == 4)
        {
            var quarterSize = new Size(finalSize.Width / 2, finalSize.Height / 2);
            Children[0].Arrange(new Rect(new Point(0, 0), quarterSize));
            Children[1].Arrange(new Rect(new Point(finalSize.Width / 2, 0), quarterSize));
            Children[2].Arrange(new Rect(new Point(0, finalSize.Height / 2), quarterSize));
            Children[3].Arrange(new Rect(new Point(finalSize.Width / 2, finalSize.Height / 2), quarterSize));
        }
        else if (Children.Count > 4)
        {
            //???
        }

        return base.ArrangeOverride(finalSize);
    }
}`

PS:请确保 Children count 小于 5

【讨论】:

  • 看起来像正确的技术大纲,但您需要一个更算法的布局解决方案。多达 99 名以上的儿童。
  • @HenkHolterman,Rock3rRullz 要求最多 4 个元素 :-) 即瓷砖中的照片(Windows 手机之类)4 个项目是一个限制 + 我有点懒 :( 并且作者没有指定像 5 个元素这样的情况。
  • 海。是的,我将永远有 4 个元素。谢谢,这为我节省了很多时间。
  • @Nagg:FinalSize 在 ArrangeOverride() 中永远不会是无限的,而在“MeasureOverride(Size availableSize)”中的 availableSize 确实可以是无限的。
  • @PeterHuber,同意,它不允许您在 MeasureOverride 中传递无穷大作为返回值。我会从我的答案中删除它
猜你喜欢
  • 2014-08-23
  • 2012-02-01
  • 2021-10-01
  • 2011-01-25
  • 2021-06-23
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多