XAML 在UWP中绑定到另一个元素的大小(宽度/高度)的正确方法是什么?

fumotvh3  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(102)

UWP有一个设计问题:存储布局操作结果的ActualHeight/ActualWidth始终为实数。但是,由于它们更新得如此频繁,UWP不会在它们更改时通知。
Height/Width确实提供了更改通知,但通常可能是NaN,例如当对象设置为拉伸以填充父对象时。
答案似乎是:订阅SizeChanged并使用ActualHeight和ActualWidth直接调整依赖于大小的属性。
然而,我遇到了后者的另一个问题,不是所有的子控件都能正确地重绘,这似乎是因为SizeChanged事件有时会被删除,因此一些子控件会被旧的大小值卡住。这个问题在快速调试时会变得更加明显。一个缓慢的小调整大小导致他们重新绘制正确。我猜,为了提高性能,UWP渲染框架试图减少绘图时发生的工作量。
什么是正确的方法来做这件事?和/或如果我继续使用SizeChanged,我如何确保最终值被呈现,或者减少所做的工作,以便接收所有SizeChanged事件?
(w/ Win10 16299 SDK)
更新:SizeChanged的错误行为部分是由于我对事件处理程序逻辑的错误排序。但是,有些窗台板框架中的对象位置不一致。在进一步检查,这似乎是一个错误,在网格定位。

0x6upsns

0x6upsns1#

假设你有两个元素:一个TextBox和一个ComboBox。你想当文本框的大小改变时,组合框的大小也应该改变。请参见this

<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);

有关代码文件中绑定的更多信息,请参见thisthis

相关问题