2017-10-18 52 views
1

UWP有一个设计问题: 存储布局操作结果的ActualHeight/ActualWidth始终是一个实数。但是,由于它们经常更新,UWP在更改时不通知。在UWP中绑定另一个元素的大小(宽度/高度)的正确方法是什么?

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

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

但是,我遇到了后者的另一个问题,那里并不是所有的子控件都能够正确重画,而且这似乎是因为SizeChanged事件有时会被丢弃,所以一些子控件会被旧的尺寸值卡住。通过快速调整大小,此问题更加明显。缓慢的小尺寸调整会导致它们正确重画。我猜测对于性能来说,UWP渲染框架会尝试减少绘图时发生的工作量。

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

(W/Win10 16299 SDK)

UPDATE:SizeChanged将所述的不当行为,部分是由于我的事件处理程序逻辑的乱序。但是,有一些门槛框架,其中应该相同位置的物体未对齐。在进一步的检查中,这似乎是网格定位中的一个错误。

回答

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

有关代码文件绑定的详细信息,请参阅this,并且this

+0

我明白,虽然我的需求是更复杂一点。我在代码中动态地添加了对象,并通过带参数的ValueConverter按比例定位它们。正如我所说的,当对象被自动化时,无论元素的大小如何,高度和宽度都是NaN。 –

+0

@NickBauer如果你从不设置它们,'Width'和'Height'将始终为'NaN'。你可以使用'ActualWidth'和'ActualHeight'或'RenderSize' - 这些属性在SizeChanged事件之后被初始化。并尝试使用'x:绑定' - 它'更快,并有更多的功能。 –

+0

@NickBauer我更新了答案,希望我能帮助你。 –

相关问题