2012-06-13 97 views
6

的高度/寬度我有以下代碼獲取窗口WPF

<Window x:Class="Netspot.DigitalSignage.Client.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" WindowStyle="SingleBorderWindow" 
     WindowStartupLocation="CenterScreen" 
     WindowState="Normal" Closing="Window_Closing"> 

任何企圖取回高度/寬度回報的NaN或0.0

誰能告訴我得到它的方法嗎?

這兩個方法都不奏效

//Method1 
var h = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualHeight; 
var w = ((System.Windows.Controls.Panel)Application.Current.MainWindow.Content).ActualWidth; 

//Method2 
double dWidth = -1; 
double dHeight = -1; 
FrameworkElement pnlClient = this.Content as FrameworkElement; 
if (pnlClient != null) 
{ 
    dWidth = pnlClient.ActualWidth; 
    dHeight = pnlClient.ActualWidth; 
} 

的應用程序將無法運行全屏。

+3

你在哪裏試這個代碼?如果你在窗口的構造函數中嘗試,否則它將不起作用,否則'this.ActualHeight'會給你窗口的實際高度 – Habib

+0

,所以我必須在window_loaded之後做到這一點?好點我怎麼才能確定一個尚未存在的窗口:) –

+0

的確如此,如果窗口沒有加載,你無法獲得窗口的大小 – Habib

回答

1

WPF以延遲的方式創建控件和窗口。因此,直到窗口第一次顯示,它可能還沒有通過佈局,因此沒有ActualWidth/ActualHeight。您可以等到窗口加載後再獲取屬性,或者更好地將這些屬性綁定到需要它們的目標。你也可以通過UpdateLayout()強制佈局。

只是想添加:儘量減少尺寸依賴邏輯的數量,它幾乎總是可以避免它。除非你正在編寫佈局面板。

6

你可以得到的寬度和高度,窗口的意思是在構造函數中後InitializeComponent一直跑,他們不會返回NaN然後,直到窗口已經顯示的實際高度和寬度將不得不等待。

WindowState == Normal你可以在IntializeComponent()之後從Width/Height做到這一點。

WindowState == Maximized您可以用

System.Windows.SystemParameters.PrimaryScreenHeight; 
System.Windows.SystemParameters.PrimaryScreenWidth; 
+0

這是主監視器屏幕的屏幕高度和寬度,不一定是當前屏幕。 – user2481095

+0

問題不在於獲取「當前屏幕」值,而是爲什麼該操作獲得NaN而不是值。 – Andy

5

你必須嘗試,一旦窗口中加載UI拿到ActualWidth/ActualHeight值獲得這一個屏幕分辨率。在Window_Loaded中使用它效果很好。

1

1)訂閱窗口重新大小事件後面的代碼:

this.SizeChanged += OnWindowSizeChanged; 

2)使用SizeChangedEventArgs對象 'E' 來獲得你需要的大小:

protected void OnWindowSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    double newWindowHeight = e.NewSize.Height; 
    double newWindowWidth = e.NewSize.Width; 
    double prevWindowHeight = e.PreviousSize.Height; 
    double prevWindowWidth = e.PreviousSize.Width; 
} 

請記住,這是非常普遍的情況,你可能(你可能不是)必須做一些檢查,以確保你的尺寸值爲0.

我用它來動態調整列表框的大小窗口更改。基本上我只想要這個控件的高度來改變窗口高度變化的相同數量,所以它的父窗口在任何窗口變化中看起來都是一致的。

以下是一個代碼,更具體的例子:

注:我有一個私有實例整數稱爲被設置爲0構造函數中的窗口後面的代碼「resizeMode」。

這裏是OnWindowSizeChanged事件處理程序:在InitializeComponent後

protected void OnWindowSizeChanged (object sender, SizeChangedEventArgs e) 
    { 
     if (e.PreviousSize.Height != 0) 
     { 
      if (e.HeightChanged) 
      { 
       double heightChange = e.NewSize.Height - e.PreviousSize.Height; 
       if (lbxUninspectedPrints.Height + heightChange > 0) 
       { 
        lbxUninspectedPrints.Height = lbxUninspectedPrints.Height + heightChange; 
       } 
      } 
     } 
     prevHeight = e.PreviousSize.Height; 
    } 
+0

這應該是答案 – 2016-05-10 15:24:49

3

XAML

<Grid x:Name="Grid1"> 
     <Image x:Name="Back_Image" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
</Grid> 

CS 主窗口()();

Back_Image.Width = Grid1.Width; 
    Back_Image.Height = Grid1.Height; 
+1

歡迎來到Stack Overflow。在發佈答案時,請在答案中解釋您的答案如何解決他們的問題,以幫助海報和未來的搜索者。 – SnareChops

1

注意,當您使用的控制與100%,他們有一個NaN的大小,直到他們被代表

您可以檢查ActualHeigh或ActualWidth的只是當Loaded事件被解僱,但從來沒有嘗試在創建Windows控件之前驗證它。忘記在構造函數中控制它的想法。

在我的看法中,控制這種事情的最好的地方是SizeChanged事件