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

时间:2017-10-18 22:55:35

标签: c# xaml uwp uwp-xaml

UWP存在设计问题: ActualHeight / ActualWidth(存储布局操作的结果)始终是实数。但是,由于它们经常更新,因此UWP在更改时不会通知。

高度/宽度确实提供更改通知,但通常可能是NaN,就像将对象设置为拉伸以填充父级一样。

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

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

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

(w / Win10 16299 SDK)

更新:SizeChanged的错误行为部分是由于我对事件处理程序逻辑的错误排序。但是,存在窗框,其中应该相同定位的对象未对齐。在进一步检查时,这似乎是网格定位中的一个错误。

1 个答案:

答案 0 :(得分:2)

假设您有2个元素: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