获取窗口 WPF 的高度/宽度

本文关键字:宽度 高度 窗口 WPF 获取 | 更新日期: 2023-09-27 18:37:05

>我有以下代码

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

应用程序不会全屏运行。

获取窗口 WPF 的高度/宽度

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

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

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

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

System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;

一旦窗口在UI中加载,您必须尝试获取ActualWidth/ActualHeight值。在Window_Loaded中这样做效果很好。

XAML

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

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

    Back_Image.Width = Grid1.Width;
    Back_Image.Height = Grid1.Height;

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

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

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

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

在我看来,控制这种事情的最佳位置是 SizeChanged 事件

嗨,

您可以使用 WPF 获取当前屏幕的高度

System.Windows.SystemParameters.PrimaryScreenHeight

我只是向我的窗口添加一个变量名称,然后从其宽度或高度属性中获取我想要的窗口的宽度或高度。

XAML:

<Window x:Name="exampleName"
   ...
</Window>

C#:

exampleName.Height;

或:

exampleName.Width;

我在 MVVM 情况下的解决方案...

我有一个ViewModelBase,它是应用程序的所有视图模型的基类。

1.)我在ViewModelBase创建了一个虚拟方法,该方法可以在子视图模型中被覆盖。

public virtual void OnWindowSizeChanged(object sender, SizeChangedEventArgs e) {}

2.) MainWindow : Window类的点击率

public MainWindow(object dataContext)
{
    InitializeComponent();
    if (dataContext is ViewModelBase)
    {
        this.SizeChanged += ((ViewModelBase)dataContext).OnWindowSizeChanged;
        DataContext = dataContext;
    }
}

3.)例如。在MainViewModel中,这是扩展ViewModelBase

public override void OnWindowSizeChanged(object sender, SizeChangedEventArgs e)
{
    Console.WriteLine(e.NewSize.Height);
}