C# Windows Phone 8 解決【取得控制項 Height 、Width 總是 0】,並取得實際寬高數據。

  • 1464
  • 0
  • C#
  • 2015-06-08

一般我們寫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" />
 

1

 

 

一般錯誤的方法(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

 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝
轉載請註明出處,並且附上本篇文章網址 !  感謝。

SUKI

HOLIESTAR