51

根据WindowStartupLocation 属性的 MSDN 文档:

设置 CenterScreen 会导致一个窗口位于包含鼠标光标的屏幕中心。

尽管CenterScreen 字段本身的 MSDN 文档将其定义为:

窗口的启动位置是打开它的屏幕的中心。

一个简单的测试表明它可以正常工作:

主窗口.xaml

<Window x:Class="CenterScreenTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Button Click="button_Click">Open Window</Button>
</Window>

主窗口.xaml.cs

using System.Windows;

namespace CenterScreenTest
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            Window window = new Window();
            window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            window.Show();
        }
    }
}

如果您在双显示器系统上对此进行测试,您可以看到新窗口将在您单击按钮时鼠标光标所在的屏幕居中。这正是它应该如何工作的。

但是,如果您尝试在显示之前将窗口设置为最大化,则新窗口只会在您启动应用程序的显示器上最大化。将 button_Click 事件处理程序更改为以下内容以了解我的意思:

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.WindowState = WindowState.Maximized;
    window.Show();
}

现在,无论您单击按钮时鼠标光标在哪里,窗口都只会在启动应用程序的屏幕上最大化。如果在显示后将窗口状态设置为最大化,CenterScreen 可以正常工作。这相当于用户最大化窗口。例如:

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.Show();
    window.WindowState = WindowState.Maximized;
}

当然,这里的问题是,在显示窗口后最大化窗口需要更长的时间,并且在像我这样的应用程序中,窗口需要立即弹出到位。

有人知道解决方案吗?

4

4 回答 4

97

您可以在 XAML 中设置它

<Window Height="300" Width="300" WindowState="Maximized">
</Window>

您需要将SizeToContent设置为Manual。有关详细信息,请参阅其他答案。

于 2014-01-19T19:55:34.267 回答
45

我在 MSDN WPF 论坛上问了同样的问题,并通过这个很棒的解决方法得到了答案:

void button_Click(object sender, RoutedEventArgs e)
{
    Window window = new Window();
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
    window.SourceInitialized += (s, a) => window.WindowState = WindowState.Maximized;
    window.Show();
}

我还向 Microsoft 提交了有关此问题的错误报告,他们目前正在审查该报告。

于 2010-06-30T17:51:01.750 回答
8

可以通过对 XAML 标记进行以下添加来实现从窗口最大化开始。

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Manual">
</Window>

WindowState属性从属于SizeToContent,这意味着您需要设置后者Manual(如果您希望实际最大化)。您还可以将SizeToContent设置为HeightWidth(如果您希望在一个维度上最大化窗口,而在另一个维度上遵循基于控件大小计算的大小)。

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Width">
</Window>

以上将使窗口从上到下跨越,但不一定从左到右边缘。相当于按组合键Win+ Shift+ Up

于 2016-08-27T09:34:47.800 回答
5

确保将 SizeToContent 设置为 SizeToContent.Manual,否则将不起作用。

于 2012-07-24T08:05:44.623 回答