标签: measureoverride

WPF Panel.Children与Panel.InternalChildren - 有什么区别?

根据MSDN - Panel.InternalChildren属性:

Panel派生的类 应该使用此属性而不是Children 属性来进行内部重写,例如MeasureCoreArrangeCore.


所以,这实际上是一个2部分的问题:

  1. 如果我创建了一个我自己的Panel FooPanel,它来自Panel,我似乎无法覆盖MeasureCoreArrangeCore.我不确定为什么那句话甚至存在.但是,我可以覆盖MeasureOverrideArrangeOverride.所以,我想知道我是否还需要使用InternalChildren这两种方法的属性.

  2. Children物业和InternalChildren物业之间的真正区别是什么?

wpf children panel measureoverride arrangeoverride

9
推荐指数
1
解决办法
3120
查看次数

重写MeasureOverride和ArrangeOverride时,不会绘制WPF UserControl

我有一个UserControl看起来像这样:

<UserControl
    MaxHeight="32"
    MaxWidth="32"
    MinHeight="25"
    MinWidth="25">
    <DockPanel>
        <!-- some stuff -->
    </DockPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

除了最小/最大尺寸约束,我希望控件始终被涂上Width = Height.所以我覆盖MeasureOverrideArrangeOverride:

protected override Size MeasureOverride(Size availableSize)
{
    var resultSize = new Size(0, 0);
    ((UIElement)Content).Measure(availableSize);
    var sideLength = Math.Min(((UIElement)Content).DesiredSize.Width, ((UIElement)Content).DesiredSize.Height);

    resultSize.Width = sideLength;
    resultSize.Height = sideLength;

    return resultSize;
}

protected override Size ArrangeOverride(Size finalSize)
{
    ((UIElement)Content).Arrange(new Rect(0, 0, finalSize.Width, finalSize.Height));
    return finalSize;
}
Run Code Online (Sandbox Code Playgroud)

我明白,我必须调用Measure,并Arrange在用户控件的每一个孩子.由于DocPanel是我的用户唯一的孩子,(在我的理解)存储在Content用户控件的属性,我简单地调用MeasureArrange这个内容属性.但是不显示UserControl.我究竟做错了什么?

wpf user-controls measureoverride

6
推荐指数
1
解决办法
2012
查看次数

WPF MeasureOverride 和ArrangeOverride

我在这里的问题更多是理论问题而不是功能问题。所以我正在寻找的是一个可以用一些文档来支持的答案。

我发现自己需要为 wpf 控件的子项进行一些自定义测量/安排?

  1. 是否可以根据其他大小限制而不是作为参数接收的限制来测量孩子。
  2. 我试图实现的一些伪代码:

    MeasureOverride(size)
     {
       foreach(child in children)
       { 
         if(condition)
         {
           child.measure(size)
         }
         else
         { 
           child.measure(customSize)
           if(...)
           {
             ...
           }
           ...
         }
       }
     }
    
    Run Code Online (Sandbox Code Playgroud)

这个的所有逻辑都应该存在于 MeasureOverride 中,还是我应该只使用作为所有子项的参数接收的大小调用 measure,然后在ArrangeOverride 中执行逻辑?谢谢!

c# wpf wpf-controls measureoverride arrangeoverride

6
推荐指数
1
解决办法
5096
查看次数

如何在子类中仅更改DependencyProperty元数据的单个选项?

我们需要覆盖DependencyProperty子类的元数据.现在我知道我可以使用OverrideMetadata并指定全新的FrameworkPropertyMetadata对象,但在大多数情况下,我希望这个新的元数据与现有的元数据完全相同,除了另外一个标志集(具体AffectsMeasure)

我的想法是获取现有的元数据,创建一个新的元数据对象,手动复制从旧到新的所有成员(它不支持Clone)更改我想要的那个,然后在OverrideMetadata调用中使用新的成员.但是da**对于其他非常简单的事情来说是很多工作!

我在这里错过了什么吗?

编辑

首先,我的意思AffectsMeasure不是AffectsRender(我已经改变了),

但是......我刚刚发现我们的班级已经AffectsMeasure为该Width物业设置了旗帜.真正的问题是a ListBox(例如a ListBoxItem)的容器MeasureOverride在首次初始化时仅被调用一次.

由于这在技术上是一个无关的问题,我将开始一个新的并关闭这一个.

这是新问题的链接:

为什么ListBoxItem在宽度改变时不调用MeasureOverride?

wpf dependency-properties measureoverride

5
推荐指数
1
解决办法
579
查看次数

MeasureOverride 和 ArrangeOverride。真正的AvailableSize/DesiredSize 是什么?

我被困了两天试图理解WPF的布局原理。

我读了很多文章并探索了 wpf 源代码。

我知道测量/测量覆盖方法接受可用大小,然后设置 DesiredSize 属性。这是有道理的。它递归地调用孩子们并要求他们设置各自所需的大小。

有两件事(至少)我不明白。让我们考虑一个 WrapPanel。

  • 查看 WPF 源代码,MeasureOverride() 方法接受可用大小,然后将其传递给所有子级。然后,它返回子项中生成的desiredsize属性的最大宽度最大高度。它不应该在孩子之间划分可用空间吗?我认为它会迭代子级,然后测量第一个,然后从总可用大小中减去所得的所需大小,以便下一个子级占据更少的空间。当我阅读 WPF 时,WrapPanel.MeasureOverride 似乎没有设置适合所有子项所需的所需大小。它只是给出了任何一个孩子都适合的 DesiredSize。
  • 由于包装面板的性质,我预计对于垂直方向的堆栈面板,高度限制将导致更宽的 DesiredSize (以容纳更多列)。由于高度限制会影响环绕面板的所需大小,因此该逻辑不属于 MeasureOverride 方法吗?为什么堆叠只反映在 ArrangeOverride 方法中?

我认为我对这两种方法的机制存在一些根本性的误解。

任何人都可以给我一个 DesiredSize 和/或AvailableSize 的口头描述,使这个实现有意义吗?

wpf measureoverride arrangeoverride

4
推荐指数
1
解决办法
1670
查看次数