获取Window WPF的高度/宽度
Posted
技术标签:
【中文标题】获取Window WPF的高度/宽度【英文标题】:Get the height/width of Window WPF 【发布时间】:2012-06-16 07:38:39 【问题描述】:我有以下代码
<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;
应用程序不会全屏运行。
【问题讨论】:
你在哪里尝试这个代码?如果您正在尝试窗口的构造函数,它将无法工作,否则this.ActualHeight
将为您提供窗口的实际高度
所以我必须在 window_loaded 之后这样做?好点我怎样才能调整一个尚不存在的窗口:)
没错,如果没有加载,你就无法获取窗口的大小
你为什么要获取高度/宽度?也许还有另一种方法可以做任何你想做的事情
【参考方案1】:
WPF 以延迟方式创建控件和窗口。所以在第一次显示窗口之前,它可能还没有经过布局,因此没有ActualWidth
/ActualHeight
。您可以等到加载窗口并获取属性,或者更好地将这些属性绑定到您需要它们的目标。您也可以通过UpdateLayout()
强制布局。
只是想补充一点:尽量减少依赖于大小的逻辑的数量,几乎总是可以避免它。当然,除非您正在编写布局面板。
【讨论】:
【参考方案2】:你可以在InitializeComponent
运行后在构造函数中获取窗口的宽度和高度,它们不会返回NaN
,实际高度和宽度将不得不等到窗口已显示。
当WindowState == Normal
时,您可以在IntializeComponent()
之后从Width / Height
执行此操作。
当WindowState == Maximized
你可以用
System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;
【讨论】:
这是主显示器屏幕的屏幕高度和宽度,不一定是当前屏幕。 问题不在于获取“当前屏幕”值,而是询问为什么 op 获取的是 NaN 而不是值。【参考方案3】:在 UI 中加载窗口后,您必须尝试获取 ActualWidth/ActualHeight
值。在 Window_Loaded 中执行此操作效果很好。
【讨论】:
【参考方案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”的私有实例整数,它在后面的窗口代码的构造函数中设置为 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;
【讨论】:
这应该是答案【参考方案5】: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;
【讨论】:
欢迎来到 Stack Overflow。发布答案时,请通过在您的答案中解释您的答案如何解决他们的问题来帮助发布者和未来的搜索者。【参考方案6】:请注意,当您使用 100% with 的控件时,它们的大小为 NaN,直到它们被表示
您可以仅在触发 Loaded 事件时检查 ActualHeigh 或 ActualWidth,但不要在创建 Windows 控件之前尝试验证它。忘记在构造函数中控制它的想法。
在我看来,控制这种事情最好的地方是 The SizeChanged 事件
【讨论】:
以上是关于获取Window WPF的高度/宽度的主要内容,如果未能解决你的问题,请参考以下文章