如何使用鼠标光标在屏幕上最大化WPF窗口?

时间:2010-06-25 22:41:04

标签: .net wpf multiple-monitors maximize windowstate

根据WindowStartupLocation Property的MSDN文档:

  

设置CenterScreen会使窗口位于包含鼠标光标的屏幕中央。

尽管CenterScreen Field本身的MSDN文档将其定义为不太清楚:

  

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

一个简单的测试表明它应该正常工作:

MainWindow.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>

MainWindow.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 个答案:

答案 0 :(得分:81)

您可以在XAML中设置

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

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

答案 1 :(得分:40)

我在MSDN WPF论坛上问了同样的问题并得到了this awesome workaround的答案:

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提交了关于此问题的bug report,他们目前正在审核这些问题。

答案 2 :(得分:5)

确保将SizeToContent设置为SizeToContent.Manual,否则它将无法正常工作。

答案 3 :(得分:2)

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

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

属性 WindowState 从属于 SizeToContent ,这意味着您需要设置后者 Manual (如果您希望实际最大化) 。您还可以将 SizeToContent 设置为高度宽度(如果您希望在一个维度上最大化窗口,而服从基于控制另一方面的尺寸。

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

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