获取Window WPF的高度/宽度

Wel*_*ing 9 c# wpf height xaml 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">
Run Code Online (Sandbox Code Playgroud)

任何获得高度/宽度的尝试都返回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;
}
Run Code Online (Sandbox Code Playgroud)

该应用程序将不会全屏运行.

And*_*ndy 9

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

WindowState == Normal你可以从Width / Height之后做这个IntializeComponent().

WindowState == Maximized你可以得到这个的屏幕分辨率

System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;
Run Code Online (Sandbox Code Playgroud)

  • 这是主监视器屏幕的屏幕高度和宽度,不一定是当前屏幕。 (2认同)

kfo*_*eck 6

1.)在后面的代码中订阅window re size事件:

this.SizeChanged += OnWindowSizeChanged;
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

请记住,这是一种非常普遍的情况,您可能(也可能不会)必须进行一些检查以确保大小值为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;
    }
Run Code Online (Sandbox Code Playgroud)


Dav*_*ham 5

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


Vil*_*ert 5

XAML

<Grid x:Name="Grid1">
      <Image x:Name="Back_Image" HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

在 InitializeComponent() 之后的CS MainWindow();

    Back_Image.Width = Grid1.Width;
    Back_Image.Height = Grid1.Height;
Run Code Online (Sandbox Code Playgroud)

  • 欢迎使用堆栈溢出。在发布答案时,请通过在您的答案中解释您的答案如何解决他们的问题来帮助发布者和未来的搜索者。 (3认同)

dow*_*for 1

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

只是想补充一点:尽量减少大小相关逻辑的数量,几乎总是可以避免它。当然,除非您正在编写布局面板。