14

我有以下代码

<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

谁能告诉我获取方法?

这2个方法都不行

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

该应用程序不会全屏运行。

4

6 回答 6

12

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;
    }
于 2014-04-04T18:30:08.073 回答
11

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

什么时候WindowState == Normal你可以从Width / Height之后做这个IntializeComponent()

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

System.Windows.SystemParameters.PrimaryScreenHeight;
System.Windows.SystemParameters.PrimaryScreenWidth;
于 2012-06-13T11:01:23.270 回答
5

ActualWidth/ActualHeight在 UI 中加载窗口后,您必须尝试获取这些值。在 Window_Loaded 中执行此操作效果很好。

于 2012-06-13T12:40:51.500 回答
5

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;
于 2015-11-22T06:05:40.310 回答
1

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

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

于 2012-06-13T10:58:25.703 回答
1

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

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

在我看来,控制这类事情的最佳地点是 The SizeChanged 事件

于 2016-05-18T23:18:24.517 回答