2010-06-25 64 views
38

根据MSDN文档的WindowStartupLocation Property如何使用鼠标光标在屏幕上最大化WPF窗口?

设置中心屏幕使窗口被定位在包含鼠标光标在屏幕的中心。

虽然MSDN文档为CenterScreen Field本身定义它稍差明确为:

窗口的启动位置是在其上打开的屏幕的中心。

一个简单的测试表明这个工作,因为它应该:

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

这里的问题,当然,是显示它之后最大化窗口花费更长的时间,在一个应用程序,如矿山,窗口需要立即弹出到位。

任何人都知道解决方案吗?

回答

36

我问在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(); 
} 

我还提交了bug report这个问题,以微软,他们目前正在审查。

5

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

+0

你实际上需要** **这些事情。请查看我的答案以确保。无论如何。 – 2016-08-27 09:38:43

69

您可以设置它在XAML

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

您需要设置SizeToContent手册。详情请参阅其他答案。

3

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

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

酒店的WindowState是从属于SizeToContent,这意味着你需要设置后者手册(如果你愿意的实际最大化)。您还可以设置SizeToContent高度宽度(如果您希望最大化一个维度中的窗口,而服从基于控件的大小另一维度计算的大小)。

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

以上将使窗口跨度从上到下但不一定是从左到右的边缘。这相当于按下组合键 + 移位 + 增加

相关问题