WPF当孩子的宽度绑定到父亲的实际宽度时会发生什么

时间:2013-07-11 21:45:43

标签: c# wpf xaml actualwidth

那么,如果我将一个绑定放在子对象的宽度上,并将其链接到其父级ActualWidth,那么会发生什么?

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

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

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

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

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

然而,我清楚地记得早些时候在我的另一个控制中试图让它不起作用,所以我回去试图弄清楚这两个案例之间的区别是什么。基本上它归结为其中一个在堆叠面板中的几个级别。

所以现在我正在使用一个绑定,另一个使用minwidth plus alignment方法。 无论如何只对此感兴趣,以确保我做事的方式不会在以后产生奇怪的错误。

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

1 个答案:

答案 0 :(得分:3)

根据DispatherPriority enumDataBinding发生在Rendering之前。

  • 发送
  • 正常 - 构造函数在此处运行
  • 的DataBind
  • 渲染
  • 加载
  • 背景
  • ContextIdle
  • ApplicationIdle
  • SystemIdle
  • 无效
  • 无效
  • 输入

因此绑定会在渲染发生之前首先尝试进行评估。

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

this SO answer的第二部分也可以帮助您理解。注意#6。

  

创建并显示Window时的事件序列

     

根据要求,这是WPF中的主要事件序列   窗口已创建并显示:

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

  2.   
  3. 当每个元素被添加到可视或逻辑树时,会触发其初始化事件,这会导致样式和触发器成为   发现应用除了任何特定于元素的初始化你   可以定义[注意:逻辑中的叶子不会触发初始化事件   树,如果根源没有PresentationSource(例如Window)

  4.   
  5. 窗口和所有未折叠的Visuals都是Measured,这会导致每个Control上的ApplyTemplate,这会导致额外的   对象树构造包括更多构造函数和   getter / setter方法

  6.   
  7. 窗口及其上所有未折叠的视觉效果都是“已安排”

  8.   
  9. 窗口及其后代(逻辑和可视)接收Loaded事件

  10.   
  11. 重试首次设置失败的任何数据绑定

  12.   
  13. 窗口及其后代有机会直观地呈现其内容

  14.         

    创建Window时完成步骤1-2,无论是否为   所示。其他步骤通常直到Window才会发生   显示,但如果手动触发,它们可以更早发生。