Как установить положение диалогового .ShowDialog();
окна, которое появилось из, так, чтобы оно отображалось в центре главного окна.
Так я пытаюсь установить позицию.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PresentationSource source = PresentationSource.FromVisual(this);
if (source != null)
{
Left = ??
Top = ??
}
}
В XAML, принадлежащем Dialog:
<Window ... WindowStartupLocation="CenterOwner">
и в C # при создании экземпляра Dialog:
MyDlg dlg = new MyDlg(); dlg.Owner = this; if (dlg.ShowDialog() == true) { ...
источник
var dlg = new MyDlg { Owner = this };
на втором бите.dlg.Owner = Application.Current.MainWindow;
Я думаю, что проще использовать разметку xaml
<Window WindowStartupLocation="CenterOwner">
источник
CenterParent
илиCenterOwner
? Я вижу толькоCenterOwner
в IntellisenseПросто в коде позади.
public partial class CenteredWindow:Window { public CenteredWindow() { InitializeComponent(); WindowStartupLocation = WindowStartupLocation.CenterOwner; Owner = Application.Current.MainWindow; } }
источник
Я думаю, что каждый ответ на этот вопрос является частью того, каким должен быть ответ. Я просто объединю их, что, на мой взгляд, является самым простым и элегантным подходом к этой проблеме.
Сначала настройте то место, где вы хотите разместить окно. Вот и хозяин.
<Window WindowStartupLocation="CenterOwner">
Перед открытием окна нам нужно указать ему владельца, а из другого сообщения мы можем получить доступ к MainWindow с помощью статического получателя для MainWindow текущего приложения.
Window window = new Window(); window.Owner = Application.Current.MainWindow; window.Show();
Вот и все.
источник
Я нашел это лучшим
frmSample fs = new frmSample(); fs.Owner = this; // <----- fs.WindowStartupLocation = WindowStartupLocation.CenterOwner; var result = fs.ShowDialog();
источник
Если у вас мало контроля над окнами, которые нужно отображать, следующий фрагмент может быть полезен
public void ShowDialog(Window window) { Dispatcher.BeginInvoke( new Func<bool?>(() => { window.Owner = Application.Current.MainWindow; window.WindowStartupLocation = WindowStartupLocation.CenterOwner; return window.ShowDialog(); })); }
источник
Чтобы разместить диалог 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) { ...
источник
Вы должны установить родительское окно для своего окна (Владелец), а затем установить для свойства WindowStartupLocation значение «CenterParent».
источник
Я хотел бы добавить к ответу Фредрика Хедблада, что если размер 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; }
источник
XAML:
<Window WindowStartupLocation="CenterScreen">
источник
Этот код работает, если вы не хотите использовать свойство 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'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
WindowStartupLocation="CenterOwner"
Чтобы вызвать дочернее окно как диалоговое окно и центр родительского окна, вызовите его из родительского окна, например
private void ConfigButton_OnClick(object sender, RoutedEventArgs e) { var window = new ConfigurationWindow { Owner = this }; window.ShowDialog(); }
источник
Для документации я добавлю здесь пример того, как я добился чего-то подобного. Что мне было нужно, так это всплывающее окно, охватывающее всю область содержимого родительского окна (за исключением строки заголовка), но простое центрирование диалогового окна и растягивание его содержимого не работало, потому что диалоговое окно всегда было немного смещено снизу.
Примечание о взаимодействии с пользователем: неприятно не иметь возможности перетащить / закрыть родительское окно, когда отображается диалоговое окно без полей, поэтому я бы пересмотрел его использование. Я также решил не делать этого после публикации этого ответа, но оставлю это для других.
После некоторого поиска в 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
работы ручного позиционирования .Результат:
Не знаю, есть ли более простой способ сделать это, но, похоже, у меня ничего не работало.
источник