【问题标题】:How can I make a WPF window maximized on the screen with the mouse cursor?如何使用鼠标光标在屏幕上最大化 WPF 窗口?
【发布时间】:2011-03-08 12:08:18
【问题描述】:

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

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

有人知道解决办法吗?

【问题讨论】:

  • tl;dr: 将WindowStartupLocation 设置为CenterScreen 以使用鼠标光标在屏幕上打开它;然后在Loaded 事件中添加this.WindowState = WindowState.Maximized;。 (在 Windows 10 上,如果您这样做,它只会以最大化方式打开,并且在屏幕上使用鼠标光标;因为在窗口首次显示之前加载会触发。)

标签: .net wpf multiple-monitors maximize windowstate


【解决方案1】:

您可以在 XAML 中设置它

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

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

【讨论】:

    【解决方案2】:

    我在 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,他们目前正在审查。

    【讨论】:

    • 这和鼠标光标有什么关系?
    【解决方案3】:

    可以通过在 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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 你实际上需要做both那些事情。请查看我的答案以确保。无论如何 +1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      相关资源
      最近更新 更多