如何设置来自.ShowDialog();
的Dialog位置,以显示在mainWindows的中心。
这是我尝试设定位置的方式。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PresentationSource source = PresentationSource.FromVisual(this);
if (source != null)
{
Left = ??
Top = ??
}
}
答案 0 :(得分:239)
在属于对话框的XAML中:
<Window ... WindowStartupLocation="CenterOwner">
并在C#中实例化对话框:
MyDlg dlg = new MyDlg();
dlg.Owner = this;
if (dlg.ShowDialog() == true)
{
...
答案 1 :(得分:41)
我认为使用xaml标记更容易
<Window WindowStartupLocation="CenterOwner">
答案 2 :(得分:29)
您可以尝试在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;
}
答案 3 :(得分:19)
只是代码背后。
public partial class CenteredWindow:Window
{
public CenteredWindow()
{
InitializeComponent();
WindowStartupLocation = WindowStartupLocation.CenterOwner;
Owner = Application.Current.MainWindow;
}
}
答案 4 :(得分:15)
我认为每个人对这个问题的回答都是答案的一部分。我会简单地把它们放在一起,我认为这是解决这个问题的最简单和优雅的方法。
首先设置您希望窗口所在的位置。这是所有者。
<Window WindowStartupLocation="CenterOwner">
在打开窗口之前,我们需要给它所有者,我们可以从另一个帖子使用当前应用程序MainWindow的静态getter访问MainWindow。
Window window = new Window();
window.Owner = Application.Current.MainWindow;
window.Show();
就是这样。
答案 5 :(得分:8)
我发现这个是最好的
frmSample fs = new frmSample();
fs.Owner = this; // <-----
fs.WindowStartupLocation = WindowStartupLocation.CenterOwner;
var result = fs.ShowDialog();
答案 6 :(得分:3)
要使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)
{
...
答案 7 :(得分:2)
您必须将父窗口设置为窗口(所有者),然后将WindowStartupLocation属性设置为“CenterParent”
答案 8 :(得分:2)
我想添加Fredrik Hedblad的回复,如果MainWindows已经调整大小或最大化,结果将是错误的,因为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;
}
答案 9 :(得分:0)
XAML:
<Window WindowStartupLocation="CenterScreen">
答案 10 :(得分:0)
如果您不想在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”。
答案 11 :(得分:0)
对于子窗口,设置为XAML
WindowStartupLocation="CenterOwner"
要将您的子窗口作为对话框和父窗口的中心进行调用,请从父窗口调用它,例如
private void ConfigButton_OnClick(object sender, RoutedEventArgs e)
{
var window = new ConfigurationWindow
{
Owner = this
};
window.ShowDialog();
}
答案 12 :(得分:0)
如果您对需要显示的窗口几乎没有控制,则以下代码段可能会有用
public void ShowDialog(Window window)
{
Dispatcher.BeginInvoke(
new Func<bool?>(() =>
{
window.Owner = Application.Current.MainWindow;
window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
return window.ShowDialog();
}));
}
答案 13 :(得分:0)
为了便于说明,我将在此处添加一个示例,说明如何实现类似目的。我需要的是一个弹出窗口,该弹出窗口覆盖了整个父Window内容区域(标题栏除外),但是仅使对话框居中并拉伸其内容是行不通的,因为对话框总是从底部偏移一点。
有关用户体验的提示:在显示无边界对话框时,无法拖动/关闭父窗口很不好,所以我会重新考虑使用它。发布此答案后,我还决定不执行此操作,但将其留给其他人查看。
经过一些谷歌搜索和测试之后,我终于设法做到了:
var dialog = new DialogWindow
{
//this = MainWindow
Owner = this
};
dialog.WindowStartupLocation = WindowStartupLocation.Manual;
dialog.WindowStyle = WindowStyle.None;
dialog.ShowInTaskbar = false;
dialog.ResizeMode = ResizeMode.NoResize;
dialog.AllowsTransparency = true;
var ownerContent = (FrameworkElement) Content;
dialog.MaxWidth = ownerContent.ActualWidth;
dialog.Width = ownerContent.ActualWidth;
dialog.MaxHeight = ownerContent.ActualHeight;
dialog.Height = ownerContent.ActualHeight;
var contentPoints = ownerContent.PointToScreen(new Point(0, 0));
dialog.Left = contentPoints.X;
dialog.Top = contentPoints.Y;
dialog.ShowDialog();
DialogWindow
是一个窗口,其所有者设置为主应用程序窗口。必须将WindowStartupLocation
设置为Manual
才能手动定位。
结果:
我不知道是否有更简单的方法来执行此操作,但是似乎没有其他方法适合我。