一般我們寫Windows Phone App時會為了畫面的美觀而去排版,時而因為解析度的問題或是內容長度並不固定,會影響控制項(如 Grid、Stackpanel…等)的長寬,開發者又因需要這些寬高資料進一步的修改其他控制項的外觀,所以很直覺的我們會再程式碼中直接取得Height 、Width,但是有時會發生弔詭的現象就是這兩個數據Always 0,因此奇怪的現象,就要用奇怪的方法解決(誤...)。
本篇文章將引導您解決【取得控制項 Height 、Width 總是 0】,並取得實際寬高數據。
一般我們寫Windows Phone App時會為了畫面的美觀而去排版,時而因為解析度的問題或是內容長度並不固定,會影響控制項(如 Grid、Stackpanel…等)的長寬,開發者又因需要這些寬高資料進一步的修改其他控制項的外觀,所以很直覺的我們會再程式碼中直接取得Height 、Width,但是有時會發生弔詭的現象就是這兩個數據Always 0,因此奇怪的現象,就要用奇怪的方法解決(誤...)。
本篇文章將引導您解決【取得控制項 Height 、Width 總是 0】,並取得實際寬高數據。
並以Xaml + C# 的Windows Phone 8 專案為例。
開啟新專案時,會自動產生MainPage的第一個畫面,以下以MainPage為例。
假設我們在MainPage.xaml上放了一個【Button】並賦予他名字
<Button x:Name="MyBtn" Content="Button" />
一般錯誤的方法(Always 0)
在MainPage.xaml.cs中的程式碼中通常直覺我們會這樣寫,以下的程式碼會在【輸出】的視窗中顯示按鈕的長寬。
1: public partial class MainPage : PhoneApplicationPage
2: {
3: public MainPage()
4: {
5: InitializeComponent();
6:
7: Debug.WriteLine("按鈕的寬=" + MyBtn.Width);
8: Debug.WriteLine("按鈕的高=" + MyBtn.Height);
9: }
10:
11: }
得到的結果是:
1: 按鈕的寬=不是一個數字
2: 按鈕的高=不是一個數字
並不是我們想要的結果,因為都是零。
如果換成
1: public partial class MainPage : PhoneApplicationPage
2: {
3: public MainPage()
4: {
5: InitializeComponent();
6:
7: Debug.WriteLine("按鈕的寬=" + MyBtn.ActualWidth);
8: Debug.WriteLine("按鈕的高=" + MyBtn.ActualHeight);
9: }
10:
11: }
得到的結果是:
1: 按鈕的寬=0
2: 按鈕的高=0
還是GG~,突然覺得世界要毀滅了....
其實原因其實是因為在public MainPage() 時,控制項在舞台上尚未繪製完成,所以取到的數據都會是0;所以我們必須在物件已經繪製完成後才能得到控制項的寬跟高。
那要怎麼做呢?我們應該要在MainPage的舞台還有Layout已經繪製完成時才能取得控制項的寬跟高,所以必須要在MainPage的LayoutUpdated事件中取得控制項的寬跟高,以下為正確的寫法:
1: public partial class MainPage : PhoneApplicationPage
2: {
3: public MainPage()
4: {
5: InitializeComponent();
6: this.LayoutUpdated += (sender, e) => {
7: Debug.WriteLine("按鈕的寬=" + MyBtn.ActualWidth);
8: Debug.WriteLine("按鈕的高=" + MyBtn.ActualHeight);
9: };
10:
11: }
12:
13: }
得到的結果是:
1: 按鈕的寬=120
2: 按鈕的高=72
突然覺得世界又被英雄拯救了,覺得美好 ! !
Reference : FrameworkElement.ActualWidth property
文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 ! 感謝。