2017-10-18 53 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我更新了答案,希望我能幫助你。 –

相關問題