2

因此,如果我将绑定放置在将其链接到其父对象的子对象的宽度上ActualWidth,会发生什么?

我的猜测是,父母测量孩子想要多少宽度,孩子告诉父母 0 宽度,然后在安排期间给父母实际空间,它试图给孩子零,因为孩子不想要。那么给予父级的空间的实际宽度应该会导致绑定改变子级的宽度。在这一点上,我猜想再次执行布局。

但是,这假设绑定不会传播得那么快。当绑定值传播到目标时,我仍然很模糊。这完全取决于父母的实际宽度值何时发生变化。布局完成后会发生这种情况吗?然后装订件更新?每个绑定都会中断当前运行的代码去更新目标值吗?如果不是,如果一个绑定传播需要重绘的更改,然后另一个绑定传播导致重绘的不同更改等,它不会导致问题。

有人问我的实际问题是什么:

所以最初我想有一个控制伸展来填充可用空间。很简单,但我想让它在滚动查看器中。Scrollviewer 在测量期间为其子项提供无限空间。因此,您可以将子控件的宽度和高度绑定到父控件的实际宽度和实际高度;布局做了第二遍,一切似乎都膨胀了。

但是,后来我在控件模板中拉伸控件时遇到了类似的问题,但后来发现我可以设置 minwidth 和 alignment=stretch 让它拉伸。

然而,我清楚地记得早些时候在我的另一个控件上尝试过它并且它不起作用,所以我回过头来试图弄清楚这两种情况之间的区别是什么。基本上它归结为其中一个在堆栈面板中的几个级别。

所以现在我对一个使用绑定,对另一个使用 minwidth plus 对齐方法。不管怎样,我只是对此感兴趣,以确保我做事的方式以后不会产生奇怪的错误。

我希望当宽度或高度发生变化时布局不会立即运行,而是系统会定期重新检查大小变化

4

1 回答 1

3

根据DispatherPriority 枚举DataBinding发生在之前Rendering

  • 发送
  • 正常- 构造函数在这里运行
  • 数据绑定
  • 使成为
  • 已加载
  • 背景
  • 上下文空闲
  • 应用空闲
  • 系统空闲
  • 不活跃
  • 无效的
  • 输入

所以绑定会在渲染发生之前首先尝试评估。

但是渲染可能会导致您的绑定更新,因此如果渲染父面板的过程会增加面板的宽度(例如,放置在另一个面板内的父面板会自动拉伸其子面板以占用 100% 的空间就像 aGrid或 a 中的最后一个元素一样DockPanel,那么它将触发绑定的更新并在渲染周期中增加子元素的宽度。

这个 SO 答案的第二部分也可以帮助您理解。也要注意#6。

创建和显示窗口时的事件序列

根据要求,以下是创建和显示窗口时 WPF 中的主要事件序列:

  1. 在创建对象时调用构造函数和 getter/setter,包括正在更新的对象以及从它们继承的任何对象上的 PropertyChangedCallback、ValidationCallback 等

  2. 当每个元素被添加到可视化或逻辑树时,它的 Intialized 事件会被触发,这会导致除了您可以定义的任何特定于元素的初始化之外,还可以找到样式和触发器 [注意:不会为逻辑树中的叶子触发初始化事件如果根目录下没有 PresentationSource(例如 Window)]

  3. 窗口及其上所有未折叠的视觉对象都是测量的,这会在每个控件上产生一个 ApplyTemplate,这会导致额外的对象树构造,包括更多的构造函数和 getter/setter

  4. 窗口及其上所有未折叠的视觉对象均已排列

  5. 窗口及其后代(逻辑和视觉)接收到 Loaded 事件

  6. 任何在首次设置时失败的数据绑定都会重试

  7. 窗口及其后代有机会以视觉方式呈现其内容

步骤 1-2 在创建窗口时完成,无论它是否显示。其他步骤通常在显示窗口之前不会发生,但如果手动触发它们可以更早发生。

于 2013-07-12T01:12:15.503 回答