获取Window WPF的高度/宽度

时间:2012-06-13 10:51:33

标签: c# wpf xaml height width

我有以下代码

<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;
}

应用程序不会全屏运行。

6 个答案:

答案 0 :(得分:9)

InitializeComponent运行后,您可以获得窗口在构造函数中的宽度和高度,它们不会返回NaN然后,实际的高度和宽度将会必须等到窗口显示出来。

WindowState == Normal Width / Height IntializeComponent()之后,WindowState == Maximized之后System.Windows.SystemParameters.PrimaryScreenHeight; System.Windows.SystemParameters.PrimaryScreenWidth; 可以执行此操作。

{{1}}时,您可以使用

获取此屏幕的分辨率
{{1}}

答案 1 :(得分:5)

在UI中加载窗口后,您必须尝试获取ActualWidth/ActualHeight值。在Window_Loaded中执行它很有效。

答案 2 :(得分:4)

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.

我使用它来在主窗口更改时动态调整列表框的大小。基本上我想要的只是这个控件的高度改变了窗口高度变化的相同数量,所以它的父“面板”在任何窗口变化时看起来都是一致的。

以下是代码,更具体的例子:

注意我有一个名为'resizeMode'的私有实例整数,在后面的Window代码的构造函数中设置为0。

这是OnWindowSizeChanged事件处理程序:

    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;
    }

答案 3 :(得分:3)

<强> XAML

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

<强> CS         在InitializeComponent();

之后的MainWindow()
    Back_Image.Width = Grid1.Width;
    Back_Image.Height = Grid1.Height;

答案 4 :(得分:1)

WPF以延迟方式创建控件和窗口。因此,在第一次显示窗口之前,它可能尚未进行布局,因此没有ActualWidth / ActualHeight。您可以等到窗口加载并获取属性,或者更好地将这些属性绑定到您需要它们的目标。您还可以通过UpdateLayout()强制进行布局。

只想添加:尝试最小化依赖于大小的逻辑量,几乎总是可以避免它。除非您正在编写布局面板。

答案 5 :(得分:1)

请注意,当您使用100%with的控件时,它们具有NaN大小,直到它们被表示

您可以在触发Loaded事件时检查ActualHeigh或ActualWidth,但在创建Windows控件之前不要尝试验证它。忘记在构造函数中控制它的想法。

在我的观点中,控制此类事物的最佳位置是The SizeChanged事件