【问题标题】:What's the correct way to bind to size (width/height) of another element in UWP?绑定到 UWP 中另一个元素的大小(宽度/高度)的正确方法是什么?
【发布时间】:2018-03-30 22:24:32
【问题描述】:

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

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

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

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

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

(带 Win10 16299 SDK)

更新:SizeChanged 的​​不当行为部分是由于我对事件处理程序逻辑的错误排序。但是,在一些门槛框架中,应该定位相同的对象没有对齐。进一步检查,这似乎是网格定位中的一个错误。

【问题讨论】:

    标签: c# xaml uwp uwp-xaml


    【解决方案1】:

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

    【讨论】:

    • 我很欣赏这一点,尽管我的需求有点复杂。我在代码中动态添加了对象,并且我通过带有参数的 ValueConverter 按比例定位它们。当对象自动调整大小时,正如我所说,无论元素的大小如何,Height 和 Width 都是 NaN。
    • @NickBauer WidthHeight 将永远是 NaN 如果您从未设置它们。您可以使用ActualWidthActualHeightRenderSize - 这些属性在SizeChanged 事件之后初始化。并尝试使用x:Bind - 它更快,功能更多。
    • @NickBauer 我更新了答案,希望能帮到你。
    猜你喜欢
    • 2011-02-13
    • 2018-10-15
    • 2013-04-01
    • 2015-05-17
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多