WPF: Как установить позицию диалога, чтобы показать в центре приложения? - PullRequest
75 голосов
/ 29 ноября 2010

Как установить позицию Диалога, пришедшую из .ShowDialog();, для отображения в центре главных окон.

Так я пытаюсь установить позицию.

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

Ответы [ 14 ]

244 голосов
/ 30 июня 2011

В XAML, принадлежащем диалогу:

<Window ... WindowStartupLocation="CenterOwner">

и в C # при создании диалогового окна:

MyDlg dlg = new MyDlg();
dlg.Owner = this;

if (dlg.ShowDialog() == true)
{
    ...
41 голосов
/ 29 ноября 2010

Я думаю, что проще использовать разметку xaml

<Window WindowStartupLocation="CenterOwner">
30 голосов
/ 30 ноября 2010

Вы можете попытаться заполучить MainWindow в событии Loaded, например:

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;
}
19 голосов
/ 19 февраля 2015

Только в коде позади.

public partial class CenteredWindow:Window
{
    public CenteredWindow()
    {
        InitializeComponent();

        WindowStartupLocation = WindowStartupLocation.CenterOwner;
        Owner = Application.Current.MainWindow;
    }
}
15 голосов
/ 25 мая 2017

Я думаю, что ответы каждого на этот вопрос являются частями того, каким должен быть ответ.Я просто соберу их вместе, что, я считаю, является самым простым и элегантным подходом к этой проблеме.

Первая установка, где вы хотите, чтобы окно находилось.Здесь это владелец.

<Window WindowStartupLocation="CenterOwner">

Перед тем, как открыть окно, мы должны дать ему владельца, и из другого поста мы можем получить доступ к MainWindow, используя статический метод получения для MainWindow текущего приложения.

Вот и все.

8 голосов
/ 29 декабря 2015

Я нашел этот лучший

frmSample fs = new frmSample();
fs.Owner = this; // <-----
fs.WindowStartupLocation = WindowStartupLocation.CenterOwner;
var result = fs.ShowDialog();
3 голосов
/ 13 июля 2013

Чтобы диалоговое окно WPF располагалось в центре родительской формы Windows Forms, я передал родительскую форму диалоговому окну, так как 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;
    }
}

установить расположение WindowStartup в диалоге WPF:

<Window WindowStartupLocation="CenterParent">

и способ, которым форма Windows загружает диалоговое окно WPF, выглядит следующим образом:

DialogView dlg = new DialogView();
dlg.Owner = this;

if (dlg.ShowDialog() == true)
{
    ...
2 голосов
/ 22 июня 2014

Я хотел бы добавить к ответу Фредрика Хедблада, что если бы 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;
    }
2 голосов
/ 23 февраля 2011

Необходимо установить родительское окно для своего окна (Владелец), а затем установить для свойства WindowStartupLocation значение "CenterParent"

0 голосов
/ 26 апреля 2019

Ради документации я добавлю здесь пример того, как я добился чего-то подобного. Мне нужно было всплывающее окно, охватывающее всю область содержимого родительского окна (исключая строку заголовка), но простое центрирование диалога и растяжение его содержимого не работали, потому что диалог всегда был немного смещен снизу.

Примечание об опыте пользователя: Неприятно не иметь возможности перетаскивать / закрывать родительское окно, когда отображается диалоговое окно без полей, поэтому я бы пересмотрел его использование. Я также решил не делать этого после публикации этого ответа, но оставлю это на усмотрение других.

После некоторого поиска в Google и тестирования мне наконец удалось сделать это так:

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

Я не знаю, есть ли более простой способ сделать это, но больше ничего мне не помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...