根据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;
}
这里的问题当然是在显示窗口后最大化窗口需要更长的时间,而在像我这样的应用程序中,窗口需要立即弹出窗口。
有人知道解决方案吗?
答案 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 。