UWP有一个设计问题: ActualHeight/ActualWidth,存储布局操作的结果,始终是实数。但是,由于它们更新如此频繁,UWP 不会在它们发生更改时发出通知。
高度/宽度确实提供更改通知,但通常可能为 NaN,例如当对象设置为拉伸以填充父级时。
答案似乎是:不要。订阅 SizeChanged 并使用 ActualHeight 和 ActualWidth 直接调整取决于大小的属性。
但是,我遇到了后者的另一个问题,并非所有子控件都能正确重绘,这似乎是因为 SizeChanged 事件有时会被丢弃,因此某些子控件会卡在旧的大小值中。随着快速调整大小,这个问题变得更加明显。缓慢的小调整会使它们正确地重绘。我猜测为了性能,UWP 渲染框架试图减少绘图时发生的工作量。
正确的做法是什么?和/或如果我继续使用 SizeChanged,如何确保渲染最终值,或者减少完成的工作以便接收所有 SizeChanged 事件?
(带Win10 16299 SDK)
更新:SizeChanged 的不当行为部分是由于我对事件处理程序逻辑的排序错误造成的。然而,在一些门槛框架中,本应定位相同的物体却未对齐。经过进一步检查,这似乎是网格定位中的一个错误。
假设您有 2 个元素:一个 TextBox 和一个 ComboBox。您希望每当文本框的大小发生变化时,组合框的大小也应该更改。请参阅这个。
<TextBox Name="TextBox1"></TextBox>
<ComboBox Width={Binding ElementName=TextBox1, Path=Width}
Height={Binding ElementName=TextBox1, Path=Height}><ComboBox/>
如果你想绑定在cs文件中。你可以这样做:
TextBox TextBox1=new TextBox();
Binding WidthBinding=new Binding();
WidthBinding.Source=ViewModelClass;
WidthBinding.Path=new PropertyPath("WidthPropertyInViewModelClass");
WidthBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(TextBox1, TextBox.WidthProperty, WidthBinding);