WPF WindowStartupLocation =“CenterOwner”并不是真正居中,并且到处弹出,为什么

swift

1个回答

写回答

15061225959

2025-12-10 20:34

+ 关注

屏幕
屏幕

WPF(Windows Presentation Foundation)是一种用于创建丰富、交互式的Windows应用程序的框架。在WPF中,WindowStartupLocation属性用于指定窗口的启动位置。其中,属性值"CenterOwner"被用来将窗口相对于其所有者窗口居中显示。然而,有时候我们会发现设置了WindowStartupLocation="CenterOwner"属性后,并不会真正实现窗口居中显示,并且窗口会在屏幕的任意位置弹出。那么,为什么会出现这种情况呢?

首先,让我们来看一下WindowStartupLocation属性的几种取值。除了"CenterOwner"之外,还有"CenterScreen"、"Manual"和".CenterScreen"可供选择。"CenterScreen"用于将窗口相对于屏幕居中显示,"Manual"用于手动指定窗口的位置,而".CenterScreen"则是一种. NET Core 中的语法糖,等同于"CenterScreen"。所以,如果我们将WindowStartupLocation属性设为"CenterScreen"或".CenterScreen",窗口将能够在屏幕的中央显示。

然而,当我们设置WindowStartupLocation="CenterOwner"时,窗口的居中显示并不是真正的居中,而是相对于窗口的所有者进行居中。所以,如果窗口没有明确的所有者,或者它的所有者已经居中显示,那么设置"CenterOwner"属性将会失效,窗口会在屏幕的随机位置弹出。

为了更好地理解这个问题,我们可以通过一个简单的案例代码来演示。以下是一个基于WPF的示例程序,其中包含两个窗口:MAInWindow和ChildWindow。MAInWindow作为ChildWindow的所有者窗口。

xaml

<Window x:Class="WpfApp.MAInWindow"</p> XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="MAInWindow" Height="450" Width="800">

<Grid>

<Button Content="Open Child Window" Click="OpenChildWindow_Click"/>

</Grid>

</Window>

xaml

<Window x:Class="WpfApp.ChildWindow"</p> XMLns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

XMLns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="ChildWindow" Height="300" Width="300" WindowStartupLocation="CenterOwner">

<Grid>

<TextBlock Text="This is a child window." HorizontalAlignment="Center" VerticalAlignment="Center"/>

</Grid>

</Window>

csharp

using System.Windows;

namespace WpfApp

{

public partial class MAInWindow : Window

{

public MAInWindow()

{

InitializeComponent();

}

private void OpenChildWindow_Click(object sender, RoutedEventArgs e)

{

ChildWindow childWindow = new ChildWindow();

childWindow.Owner = this;

childWindow.ShowDialog();

}

}

public partial class ChildWindow : Window

{

public ChildWindow()

{

InitializeComponent();

}

}

}

在该示例中,当我们点击MAInWindow中的按钮时,会弹出一个ChildWindow窗口。ChildWindow的WindowStartupLocation属性被设置为"CenterOwner",这意味着它应该相对于MAInWindow居中显示。

然而,当MAInWindow窗口在屏幕的左上角,并且ChildWindow没有明确的所有者时,ChildWindow并不会真正居中显示。相反,它会在屏幕的随机位置弹出。这是因为ChildWindow的所有者并没有居中显示,所以设置"CenterOwner"属性并不起作用。

解决方法:手动计算窗口的居中位置

如果我们希望实现真正的窗口居中显示,无论窗口的所有者是否居中,我们可以通过手动计算窗口的位置来实现。以下是一个示例代码,演示了如何手动计算窗口的居中位置。

csharp

private void OpenChildWindow_Click(object sender, RoutedEventArgs e)

{

ChildWindow childWindow = new ChildWindow();

childWindow.Owner = this;

double left = this.Left + (this.Width - childWindow.Width) / 2;

double top = this.Top + (this.Height - childWindow.Height) / 2;

childWindow.Left = left;

childWindow.Top = top;

childWindow.ShowDialog();

}

在这个示例中,我们通过计算MAInWindow和ChildWindow的宽度和高度差,并将其除以2,以确定ChildWindow的左上角相对于MAInWindow的位置。然后,我们将计算出的位置赋值给ChildWindow的Left和Top属性,从而实现了窗口的居中显示。

通过手动计算窗口的居中位置,我们可以确保窗口在任何情况下都能够居中显示,而不仅仅是相对于其所有者窗口居中。这种方法可以帮助我们解决WindowStartupLocation="CenterOwner"属性无法真正居中显示窗口的问题。

一下,当我们在WPF中使用WindowStartupLocation="CenterOwner"属性时,并不总是能够实现真正的窗口居中显示。这是因为"CenterOwner"属性仅仅将窗口相对于其所有者居中显示,而不是相对于屏幕。如果窗口没有明确的所有者,或者其所有者已经居中显示,那么该属性将会失效。为了解决这个问题,我们可以通过手动计算窗口的居中位置来实现真正的窗口居中显示。

举报有用(0分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号