Подтвердить что ты не робот

WPF: Как установить позицию диалога для показа в центре приложения?

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

Вот как я пытаюсь установить положение.

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

Ответ 1

Вы можете попытаться захватить 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;
}

Ответ 2

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

<Window ... WindowStartupLocation="CenterOwner">

и в С#, когда вы создаете диалоговое окно:

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

if (dlg.ShowDialog() == true)
{
    ...

Ответ 3

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

<Window WindowStartupLocation="CenterOwner">

Ответ 4

Просто в коде.

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

        WindowStartupLocation = WindowStartupLocation.CenterOwner;
        Owner = Application.Current.MainWindow;
    }
}

Ответ 5

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

Сначала установите, где вы хотите, чтобы окно было расположено. Вот он владелец.

<Window WindowStartupLocation="CenterOwner">

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

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

Что это.

Ответ 6

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

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

Ответ 7

Чтобы получить диалоговое окно WPF для размещения в центре родительской формы Windows Forms, я передал родительскую форму в диалог, так как Application.Current не вернул родительский элемент Windows Form (я предполагаю, что он работает только в том случае, если родительское приложение 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;
    }
}

установите WindowStartupLocation в диалоговом окне WPF:

<Window WindowStartupLocation="CenterParent">

и способ загрузки формы Windows Form в WPF выглядит так:

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

if (dlg.ShowDialog() == true)
{
    ...

Ответ 8

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

Ответ 9

Я хотел бы добавить к 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;
    }

Ответ 10

XAML:

    <Window WindowStartupLocation="CenterScreen">

Ответ 11

Этот код работает, если вы не хотите использовать свойство WindowStartupLocation в xaml:

private void CenterWindowOnApplication()
{
    System.Windows.Application curApp = System.Windows.Application.Current;
    Window mainWindow = curApp.MainWindow;
    if (mainWindow.WindowState == WindowState.Maximized)
    {
        // Get the mainWindow 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".

Ответ 12

Для дочернего окна установите на XAML

WindowStartupLocation="CenterOwner"

Чтобы вызвать ваше дочернее окно как диалог и центр родительского окна, вызовите его из родительского окна, например

private void ConfigButton_OnClick(object sender, RoutedEventArgs e)
{
    var window = new ConfigurationWindow
    {
        Owner = this
    };
    window.ShowDialog();
}

Ответ 13

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

    public void ShowDialog(Window window)
    {
        Dispatcher.BeginInvoke(
            new Func<bool?>(() =>
            {
                window.Owner = Application.Current.MainWindow;
                window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
                return window.ShowDialog();
            }));
    }

Ответ 14

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

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

После некоторого поиска в 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

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