你如何将你的主窗口置于WPF中?

我有一个WPF应用程序,我需要知道如何以编程方式(而不是XAML)中心的窗口。

我需要能够在启动和响应某些用户事件时做到这一点。 由于窗口大小本身是dynamic的,因此必须进行dynamic计算。

什么是最简单的方法来做到这一点? 在旧的Win32代码下,我会调用系统度量函数并全部处理。 这仍然是完成的方式还是有一个简单的CenterWindowOnScreen()函数,我现在可以调用。

 private void CenterWindowOnScreen() { double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth; double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight; double windowWidth = this.Width; double windowHeight = this.Height; this.Left = (screenWidth / 2) - (windowWidth / 2); this.Top = (screenHeight / 2) - (windowHeight / 2); } 

您可以使用此方法将窗口位置设置为屏幕的中心。

那么,对于启动时间,你可以设置启动位置 :

 window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 

稍后,您需要查询它。 信息(至less在主屏幕上)可以通过SystemParameters.PrimaryScreenWidth / Height获得。

难道不是一样简单的设置

 WindowStartupLocation="CenterScreen" 

在窗口的XAML定义中。

 Rect workArea = System.Windows.SystemParameters.WorkArea; this.Left = (workArea.Width - this.Width) / 2 + workArea.Left; this.Top = (workArea.Height - this.Height) / 2 + workArea.Top; 

这考虑到任务栏大小(通过使用System.Windows.SystemParameters.WorkArea )和位置(通过添加workArea.LeftworkArea.Top

我必须结合几个这些答案来涵盖我的情况下的所有基础:

  • 彼得的方法find当前的显示器 – 而不是只是主显示器(认真谁只有1显示器在工作了?)
  • @ Wild_A使用workarea而不是screen bounds来考虑任务栏的空间。
  • 我不得不添加DPI缩放比例,特别是对于显示1280×800为1024×640的平板电脑,但是这对于覆盖边缘情况非常有用,对此我find了答案。 请注意,如果在显示UI之前在第一次加载时调用dpiScalingvariables,则该variables为空( 此处介绍 )
 //get the current monitor Screen currentMonitor = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(Application.Current.MainWindow).Handle); //find out if our app is being scaled by the monitor PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow); double dpiScaling = (source != null && source.CompositionTarget != null ? source.CompositionTarget.TransformFromDevice.M11 : 1); //get the available area of the monitor Rectangle workArea = currentMonitor.WorkingArea; var workAreaWidth = (int)Math.Floor(workArea.Width*dpiScaling); var workAreaHeight = (int)Math.Floor(workArea.Height*dpiScaling); //move to the centre Application.Current.MainWindow.Left = (((workAreaWidth - (myWindowWidth * dpiScaling)) / 2) + (workArea.Left * dpiScaling)); Application.Current.MainWindow.Top = (((workAreaHeight - (myWindowHeight * dpiScaling)) / 2) + (workArea.Top * dpiScaling)); 

myWindowWidthmyWindowHeight是我用来手动设置窗口大小的variables。

在窗口元素中只需添加这个属性值对: WindowStartupLocation =“CenterScreen”

如果您需要在多屏幕环境中绘制一个窗口。 我已经做了一个静态类,其中以下方法可以重新使用:

 public static void PostitionWindowOnScreen(Window window, double horizontalShift = 0, double verticalShift = 0) { Screen screen = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(window).Handle); window.Left = screen.Bounds.X + ((screen.Bounds.Width - window.ActualWidth) / 2) + horizontalShift; window.Top = screen.Bounds.Y + ((screen.Bounds.Height - window.ActualHeight) / 2) + verticalShift; } 

现在在Window的构造函数中调用方法:

 this.Loaded += (s, a) => Globals.PostitionWindowOnScreen(this, 0, 0) 

作为一个基本的解决scheme,您可以使用窗口的StartupLocation属性,将其设置为在System.Windows.WindowStartupLocation枚举中定义的枚举值之一,屏幕的中心有一个:

 _wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen; 

不幸的是,这并不总是那么简单。 您需要考虑多个显示器,任务栏等。“CenterScreen”选项打开具有鼠标光标的屏幕中心的窗口。 看到这个问题的很多信息,或参考api 。

如果你一下子把它最大化
this.WindowState = System.Windows.WindowState.Maximized;

基于@Wild_A答案我刚订阅了SizeChanged事件,并添加了这个事件处理程序:

 private void Window_SizeChanged(object sender, SizeChangedEventArgs e) { try { Rect workArea = SystemParameters.WorkArea; this.Left = (workArea.Width - e.NewSize.Width) / 2 + workArea.Left; this.Top = (workArea.Height - e.NewSize.Height) / 2 + workArea.Top; } catch (Exception ex) { ... Handel exception; } }