2010-08-22 80 views
1

所以我讀過ActualWidth可能等於0,直到完全加載。我添加了事件處理程序,像這樣,以確保它的滿載:確保WPF中的ActualWidth不等於0

text.AddHandler(TextBlock.LoadedEvent, new RoutedEventHandler(textBlock_Loaded)); 

textBlock_Loaded情況下,我有:

TextBlock tb = sender as TextBlock; 
textBlockWidth = tb.ActualWidth; 

我需要在我的主要方法使用變量textBlockWidth,但每次我寫textBlockWidth的輸出值,在我的主要方法,我得到0

所以這個問題是,我該如何確保ActualWidth不爲0的執行我之前的行爲離子?由於WPF是事件驅動的,有沒有辦法在完成時觸發某種方法,而不是之前?否則,它將返回0.

回答

3

您將無法獲得ActualWidth。因爲它在加載時不會被更新。所以,你應該使用TextBlock的Dispatcher或它的Parent來獲得ActualWidthActualHeight

this.textBlock.Dispatcher.BeginInvoke((Action)(() => 
      { 
       textBlock = this.textBlock.ActualWidth; 
      })); 
+0

我已經試過了這樣的方法 - 但我的問題是,它永遠不會在我需要時加載。我在我的主要調用這個,並將ActualWidth設置爲一個變量後,我開始使用這個變量(在我的主要方法)。它仍然會返回零,因爲它還沒有加載。 – DMan 2010-08-23 14:43:35

+0

它應該工作。您可以嘗試父窗口調度程序,而不是控制的調度程序。這會幫助它看起來。 像,this.Dispatcher.BeginInvoke((Action)... http:// stackoverflow。com/questions/2452246/how-to-invoke-wpf-dispatcher-in-nunit – 2010-08-23 14:58:23

+0

嗨DMan,我試過這樣,在Loaded窗口內部加載事件一切都很好。 'this.Loaded + =(S,E)=> { this.Dispatcher.BeginInvoke((動作)(()=> { Console.WriteLine(this.textBlock.ActualWidth); Console.WriteLine(」她「); })); }; ' – 2010-08-24 16:00:29

5

爲什麼要存儲實際寬度?爲什麼不存儲對控件的引用並在真正需要時獲取實際寬度?

話雖如此,我不明白爲什麼你的代碼失敗,因爲使用加載的事件應該足夠好。根據Object Lifetime Events MSDN頁面:

Loaded事件在最終呈現之前引發,但在佈局系統計算出所有必要的呈現值之後。

所以所有的控件都應該設置它們的最終位置和大小值。另外:

Loaded事件在整個元素樹(特別是邏輯樹)中作爲協調工作引發。當樹中的所有元素處於被認爲被加載的狀態時,首先在根元素上引發Loaded事件。 Loaded事件隨後在每個子元素上依次引發。

+0

我認爲它失敗了,因爲TextBlock的加載事件觸發_after_我的代碼在Main()中使用它。 – DMan 2010-08-22 21:40:15

+0

也許「計算所有必要的渲染值」意味着只計算了DesiredSize? – HCL 2010-08-22 21:43:04

+0

+1商店參考 – HCL 2010-08-22 21:45:40