根据MSDN - Panel.InternalChildren属性:
从Panel派生的类 应该使用此属性而不是Children 属性来进行内部重写,例如MeasureCore 和ArrangeCore.
所以,这实际上是一个2部分的问题:
如果我创建了一个我自己的Panel FooPanel,它来自Panel,我似乎无法覆盖MeasureCore或ArrangeCore.我不确定为什么那句话甚至存在.但是,我可以覆盖MeasureOverride和ArrangeOverride.所以,我想知道我是否还需要使用InternalChildren这两种方法的属性.
Children物业和InternalChildren物业之间的真正区别是什么?
我有一个UserControl看起来像这样:
<UserControl
MaxHeight="32"
MaxWidth="32"
MinHeight="25"
MinWidth="25">
<DockPanel>
<!-- some stuff -->
</DockPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
除了最小/最大尺寸约束,我希望控件始终被涂上Width = Height.所以我覆盖MeasureOverride并ArrangeOverride:
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用户控件的属性,我简单地调用Measure和Arrange这个内容属性.但是不显示UserControl.我究竟做错了什么?
我在这里的问题更多是理论问题而不是功能问题。所以我正在寻找的是一个可以用一些文档来支持的答案。
我发现自己需要为 wpf 控件的子项进行一些自定义测量/安排?
我试图实现的一些伪代码:
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 中执行逻辑?谢谢!
我们需要覆盖DependencyProperty子类的元数据.现在我知道我可以使用OverrideMetadata并指定全新的FrameworkPropertyMetadata对象,但在大多数情况下,我希望这个新的元数据与现有的元数据完全相同,除了另外一个标志集(具体AffectsMeasure)
我的想法是获取现有的元数据,创建一个新的元数据对象,手动复制从旧到新的所有成员(它不支持Clone)更改我想要的那个,然后在OverrideMetadata调用中使用新的成员.但是da**对于其他非常简单的事情来说是很多工作!
我在这里错过了什么吗?
首先,我的意思AffectsMeasure不是AffectsRender(我已经改变了),
但是......我刚刚发现我们的班级已经AffectsMeasure为该Width物业设置了旗帜.真正的问题是a ListBox(例如a ListBoxItem)的容器MeasureOverride在首次初始化时仅被调用一次.
由于这在技术上是一个无关的问题,我将开始一个新的并关闭这一个.
这是新问题的链接:
我被困了两天试图理解WPF的布局原理。
我读了很多文章并探索了 wpf 源代码。
我知道测量/测量覆盖方法接受可用大小,然后设置 DesiredSize 属性。这是有道理的。它递归地调用孩子们并要求他们设置各自所需的大小。
有两件事(至少)我不明白。让我们考虑一个 WrapPanel。
我认为我对这两种方法的机制存在一些根本性的误解。
任何人都可以给我一个 DesiredSize 和/或AvailableSize 的口头描述,使这个实现有意义吗?