那么,如果我将一个绑定放在子对象的宽度上,并将其链接到其父级ActualWidth
,那么会发生什么?
我的猜测是父母测量孩子想要的宽度,孩子告诉父母0宽度,然后父母在安排期间给予实际空间,并且它试图给孩子零,因为孩子不想要任何。然后,给父级的空间的实际宽度应该导致绑定更改子级的宽度。在这一点上,我会猜测布局再次执行。
但是,这假设绑定不会那么快传播。当绑定值传播到目标时,我仍然朦胧。这一切都取决于父母的实际宽度值何时发生变化。布局完成后会发生这种情况吗?然后绑定件更新?每个绑定是否会中断当前运行的代码以更新目标值?如果没有,如果一个绑定传播需要重绘的更改,那么它不会导致问题,然后另一个绑定传播导致重绘的不同更改等。
有些人问我的实际问题是什么:
所以最初我想要一个控制拉伸来填充可用空间。很简单,但我想让它在滚动查看器中。 Scrollviewer在测量期间为其子项提供无限空间。因此,您可以将子控件的宽度和高度绑定到父级的实际宽度和实际高度;布局做了第二遍,似乎一切都在膨胀。
然而,后来我遇到了类似的问题,在控制模板中拉伸控件但后来发现我可以设置一个minwidth和alignment = stretch来拉伸它。
然而,我清楚地记得早些时候在我的另一个控制中试图让它不起作用,所以我回去试图弄清楚这两个案例之间的区别是什么。基本上它归结为其中一个在堆叠面板中的几个级别。
所以现在我正在使用一个绑定,另一个使用minwidth plus alignment方法。 无论如何只对此感兴趣,以确保我做事的方式不会在以后产生奇怪的错误。
我希望在更改宽度或高度时不会立即运行布局,而是系统会定期重新检查大小的变化
答案 0 :(得分:3)
根据DispatherPriority enum,DataBinding
发生在Rendering
之前。
因此绑定会在渲染发生之前首先尝试进行评估。
然而渲染可能会导致绑定更新,因此如果渲染父面板的过程会增加面板的宽度(例如,放置在另一个面板中的父面板会自动拉伸其子面板占用100%像Grid
中的DockPanel
或最后一个元素那样的空间,然后它将触发绑定的更新并在渲染周期中增加子的宽度。
this SO answer的第二部分也可以帮助您理解。注意#6。
创建并显示Window时的事件序列
根据要求,这是WPF中的主要事件序列 窗口已创建并显示:
在创建对象时调用构造函数和getter / setter,包括PropertyChangedCallback,ValidationCallback等 正在更新的对象以及从中继承的任何对象
当每个元素被添加到可视或逻辑树时,会触发其初始化事件,这会导致样式和触发器成为 发现应用除了任何特定于元素的初始化你 可以定义[注意:逻辑中的叶子不会触发初始化事件 树,如果根源没有PresentationSource(例如Window)
窗口和所有未折叠的Visuals都是Measured,这会导致每个Control上的ApplyTemplate,这会导致额外的 对象树构造包括更多构造函数和 getter / setter方法
窗口及其上所有未折叠的视觉效果都是“已安排”
窗口及其后代(逻辑和可视)接收Loaded事件
重试首次设置失败的任何数据绑定
- 醇>
窗口及其后代有机会直观地呈现其内容
创建Window时完成步骤1-2,无论是否为 所示。其他步骤通常直到Window才会发生 显示,但如果手动触发,它们可以更早发生。