WPF:如何设置一个对话框的位置显示在应用程序的中心?

如何设置来自.ShowDialog(); Dialog的位置.ShowDialog(); 显示在主窗口的中心。

这是我设置位置的方式。

 private void Window_Loaded(object sender, RoutedEventArgs e) { PresentationSource source = PresentationSource.FromVisual(this); if (source != null) { Left = ?? Top = ?? } } 

您可以尝试在Loaded事件中像这样获取MainWindow

 private void Window_Loaded(object sender, RoutedEventArgs e) { Application curApp = Application.Current; Window mainWindow = curApp.MainWindow; this.Left = mainWindow.Left + (mainWindow.Width - this.ActualWidth) / 2; this.Top = mainWindow.Top + (mainWindow.Height - this.ActualHeight) / 2; } 

在属于对话框的XAML中:

 <Window ... WindowStartupLocation="CenterOwner"> 

并在C#中实例化对话框时:

 MyDlg dlg = new MyDlg(); dlg.Owner = this; if (dlg.ShowDialog() == true) { ... 

我认为使用xaml标记更容易

 <Window WindowStartupLocation="CenterParent"> 

只是在代码后面。

 public partial class CenteredWindow:Window { public CenteredWindow() { InitializeComponent(); WindowStartupLocation = WindowStartupLocation.CenterOwner; Owner = Application.Current.MainWindow; } } 

我发现这是最好的

 frmSample fs = new frmSample(); fs.Owner = this; // <----- fs.WindowStartupLocation = WindowStartupLocation.CenterOwner; var result = fs.ShowDialog(); 

我想每个人对这个问题的回答都是答案的一部分。 我会简单地把它们放在一起,我相信这是对这个问题的最简单和最优雅的方法。

首先设置你想要窗口的位置。 这是店主。

 <Window WindowStartupLocation="CenterOwner"> 

在打开窗口之前,我们需要给它的所有者,从另一篇文章中,我们可以使用当前应用程序的MainWindow的静态getter访问MainWindow。

  Window window = new Window(); window.Owner = Application.Current.MainWindow; window.Show(); 

而已。

您必须将父窗口设置为窗口(所有者),然后将WindowStartupLocation属性设置为“CenterParent”

为了让WPF对话框定位在Windows窗体父窗体的中心,我将父窗体传递给对话框,因为Application.Current没有返回Windows窗体父窗体(我假设它只在父窗体应用程序是WPF的情况下才起作用)。

 public partial class DialogView : Window { private readonly System.Windows.Forms.Form _parent; public DialogView(System.Windows.Forms.Form parent) { InitializeComponent(); _parent = parent; } private void Window_Loaded(object sender, RoutedEventArgs e) { this.Left = _parent.Left + (_parent.Width - this.ActualWidth) / 2; this.Top = _parent.Top + (_parent.Height - this.ActualHeight) / 2; } } 

在WPF对话框中设置WindowStartupLocation:

 <Window WindowStartupLocation="CenterParent"> 

和Windows窗体加载WPF对话框的方式是这样的:

 DialogView dlg = new DialogView(); dlg.Owner = this; if (dlg.ShowDialog() == true) { ... 

我想添加到Fredrik Hedblad响应,如果MainWindows已被resize或最大化,结果将是错误的,因为mainWindow.Width和mainWindow.Height反映在XAML上设置的值。

如果你想要的实际值,你可以使用mainWindow.ActualWidth和mainWindow.ActualHeight:

 private void Window_Loaded(object sender, RoutedEventArgs e) { Application curApp = Application.Current; Window mainWindow = curApp.MainWindow; this.Left = mainWindow.Left + (mainWindow.ActualWidth - this.ActualWidth) / 2; this.Top = mainWindow.Top + (mainWindow.ActualHeight - this.ActualHeight) / 2; } 

如果您不想使用xaml中的WindowStartupLocation属性,则此代码有效:

 private void CenterWindowOnApplication() { System.Windows.Application curApp = System.Windows.Application.Current; Window mainWindow = curApp.MainWindow; if (mainWindow.WindowState == WindowState.Maximized) { // Get the mainWindow's screen: var screen = System.Windows.Forms.Screen.FromRectangle(new System.Drawing.Rectangle((int)mainWindow.Left, (int)mainWindow.Top, (int)mainWindow.Width, (int)mainWindow.Height)); double screenWidth = screen.WorkingArea.Width; double screenHeight = screen.WorkingArea.Height; double popupwindowWidth = this.Width; double popupwindowHeight = this.Height; this.Left = (screenWidth / 2) - (popupwindowWidth / 2); this.Top = (screenHeight / 2) - (popupwindowHeight / 2); } else { this.Left = mainWindow.Left + ((mainWindow.ActualWidth - this.ActualWidth) / 2; this.Top = mainWindow.Top + ((mainWindow.ActualHeight - this.ActualHeight) / 2); } } 

我正在使用“screen.WorkingArea”,因为任务栏使mainWindow变小。 如果要将窗口放在屏幕中间,则可以使用“screen.Bounds”。

XAML:

  <Window WindowStartupLocation="CenterScreen">