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

Ebe*_*eer 44 .net wpf multiple-monitors maximize windowstate

根据WindowStartupLocation属性的MSDN文档:

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

虽然CenterScreen字段的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>
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果在双监视器系统上测试它,您可以看到当您单击按钮时,新窗口将位于鼠标光标所在的屏幕上.这正是它应该如何运作的.

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

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

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

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

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

有人知道解决方案吗?

Art*_*luk 81

您可以在XAML中进行设置

<Window Height="300" Width="300" WindowState="Maximized">
</Window>
Run Code Online (Sandbox Code Playgroud)

您需要将SizeToContent设置为Manual.请参阅其他答案了解详情


Ebe*_*eer 42

我在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();
}
Run Code Online (Sandbox Code Playgroud)

我还向Microsoft 提交了一份关于此问题的错误报告,他们目前正在审核这些报告.


Kon*_*ten 8

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

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Manual">
</Window>
Run Code Online (Sandbox Code Playgroud)

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

<Window Height="300" Width="300" 
  WindowState="Maximized"
  SizeToContent="Width">
</Window>
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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