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

时间:2010-11-29 18:02:04

标签: wpf dialog

如何设置来自.ShowDialog();的Dialog位置,以显示在mainWindows的中心。

这是我尝试设定位置的方式。

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

14 个答案:

答案 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才能手动定位。

结果:

No dialog showing

Modal dialog showing

我不知道是否有更简单的方法来执行此操作,但是似乎没有其他方法适合我。