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

问题描述 投票:0回答:1

UWP有一个设计问题: ActualHeight/ActualWidth,存储布局操作的结果,始终是实数。但是,由于它们更新如此频繁,UWP 不会在它们发生更改时发出通知。

高度/宽度确实提供更改通知,但通常可能为 NaN,例如当对象设置为拉伸以填充父级时。

答案似乎是:不要。订阅 SizeChanged 并使用 ActualHeight 和 ActualWidth 直接调整取决于大小的属性。

但是,我遇到了后者的另一个问题,并非所有子控件都能正确重绘,这似乎是因为 SizeChanged 事件有时会被丢弃,因此某些子控件会卡在旧的大小值中。随着快速调整大小,这个问题变得更加明显。缓慢的小调整会使它们正确地重绘。我猜测为了性能,UWP 渲染框架试图减少绘图时发生的工作量。

正确的做法是什么?和/或如果我继续使用 SizeChanged,如何确保渲染最终值,或者减少完成的工作以便接收所有 SizeChanged 事件?

(带Win10 16299 SDK)

更新:SizeChanged 的不当行为部分是由于我对事件处理程序逻辑的排序错误造成的。然而,在一些门槛框架中,本应定位相同的物体却未对齐。经过进一步检查,这似乎是网格定位中的一个错误。

c# xaml uwp uwp-xaml
1个回答
3
投票

假设您有 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);

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

© www.soinside.com 2019 - 2024. All rights reserved.