XAML 获取窗口WPF的高度/宽度

uqzxnwby  于 2022-12-16  发布在  其他
关注(0)|答案(9)|浏览(467)

我有下面的代码

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

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

c2e8gylq

c2e8gylq1#

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。
我用它来动态地调整列表框的大小,因为主窗口改变了,基本上我想要的是这个控件的高度和窗口的高度改变相同的量,这样它的父“panel”在任何窗口的改变中看起来都是一致的。
下面是更具体的代码示例:

  • 注意 * 我有一个名为“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;
    }
koaltpgm

koaltpgm2#

你可以在InitializeComponent运行后在构造函数中得到窗口的宽度和高度,它们不会返回NaN,实际的高度和宽度必须等到窗口显示出来。
WindowState == Normal时,您可以在IntializeComponent()之后从Width / Height开始执行此操作。
WindowState == Maximized你可以得到这个屏幕的分辨率

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

x8diyxa73#

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

thtygnil

thtygnil4#

XAML语言

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

CS初始化组件()之后的主窗口();

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

pdkcd3nj5#

WPF以一种延迟的方式创建控件和窗口。因此,直到窗口第一次显示,它可能还没有经过布局,因此没有ActualWidth/ActualHeight。您可以等到窗口加载后再获取属性,或者更好地将这些属性绑定到您需要它们的目标。您也可以通过UpdateLayout()强制布局。
只想补充一句:尽量减少依赖于大小的逻辑,几乎总是可以避免的。2当然,除非你正在写一个布局面板。

vawmfj5a

vawmfj5a6#

请注意,当您使用具有100%的with的控件时,在表示它们之前,它们的大小为NaN
你可以在Loaded事件被触发时检查ActualHeigh或ActualWidth,但是在创建窗口控件之前不要尝试验证它,忘记在构造函数中控制它的想法吧。
在我看来,控制这类事情的最佳位置是SizeChanged事件

ldioqlga

ldioqlga7#

你好,你可以得到WPF中当前屏幕的高度

System.Windows.SystemParameters.PrimaryScreenHeight
htrmnn0y

htrmnn0y8#

我只需要给窗口添加一个变量名,然后从它的width或height属性中分别得到我想要的窗口的宽度或高度。
XAML:

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

C编号:

exampleName.Height;

或:

exampleName.Width;
ogsagwnx

ogsagwnx9#

我的解决方案是MVVM...
我有一个ViewModelBase,它是应用程序所有ViewModel的基类。
1.)我在ViewModelBase中创建了一个虚方法,它可以在子ViewModel中重写。

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

2.)MainWindow : Window类的ctr

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

相关问题