.ShowDialog();
から取得したDialogの位置を設定して、メインウィンドウの中央に表示する方法。
これは私が位置を設定しようとする方法です。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PresentationSource source = PresentationSource.FromVisual(this);
if (source != null)
{
Left = ??
Top = ??
}
}
このように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;
}
ダイアログに属するXAMLで:
<Window ... WindowStartupLocation="CenterOwner">
そして、C#でダイアログをインスタンス化するとき:
MyDlg dlg = new MyDlg();
dlg.Owner = this;
if (dlg.ShowDialog() == true)
{
...
Xamlマークアップを使用する方が簡単だと思います
<Window WindowStartupLocation="CenterOwner">
コードビハインドで。
public partial class CenteredWindow:Window
{
public CenteredWindow()
{
InitializeComponent();
WindowStartupLocation = WindowStartupLocation.CenterOwner;
Owner = Application.Current.MainWindow;
}
}
この質問に対する全員の答えは、答えがどうあるべきかの一部だと思います。この問題に対する最も簡単でエレガントなアプローチであると私は信じています。
ウィンドウを配置する最初のセットアップ。ここが所有者です。
<Window WindowStartupLocation="CenterOwner">
ウィンドウを開く前に、所有者を与える必要があり、別の投稿から現在のアプリケーションのメインウィンドウの静的ゲッターを使用してメインウィンドウにアクセスできます。
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();
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)
{
...
MainWindow.WidthとmainWindow.HeightがXAMLに設定された値を反映するため、メインウィンドウがサイズ変更または最大化された場合、結果が間違っているというFredrik Hedblad応答に追加したいと思います。
実際の値が必要な場合は、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;
}
親ウィンドウをウィンドウ(所有者)に設定し、WindowStartupLocationプロパティを「CenterParent」に設定する必要があります
表示する必要があるウィンドウをほとんど制御できない場合は、次のスニペットが役立つ場合があります
public void ShowDialog(Window window)
{
Dispatcher.BeginInvoke(
new Func<bool?>(() =>
{
window.Owner = Application.Current.MainWindow;
window.WindowStartupLocation = WindowStartupLocation.CenterOwner;
return window.ShowDialog();
}));
}
子ウィンドウの場合、XAMLで設定
WindowStartupLocation="CenterOwner"
子ウィンドウをダイアログおよび親の中心として呼び出すには、親ウィンドウから呼び出します(例:
private void ConfigButton_OnClick(object sender, RoutedEventArgs e)
{
var window = new ConfigurationWindow
{
Owner = this
};
window.ShowDialog();
}
XAML:
<Window WindowStartupLocation="CenterScreen">
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);
}
}
タスクバーによってmainWindowが小さくなるため、「screen.WorkingArea」を使用しています。ウィンドウを画面の中央に配置する場合は、代わりに「screen.Bounds」を使用できます。
ドキュメントのために、ここで似たようなことをどのように達成したかの例を追加します。必要なのは、親のウィンドウコンテンツ領域全体(タイトルバーを除く)をカバーするポップアップでしたが、ダイアログが常に下から少しオフセットされているため、ダイアログを中央に配置してコンテンツをストレッチするだけでは機能しませんでした。
ユーザーエクスペリエンスに関する注意:ボーダーレスダイアログが表示されているときに親ウィンドウをドラッグ/閉じることができないのは良くないので、使用を再検討します。また、この回答を投稿した後でこれを行わないことにしましたが、他の人が見ることができるようにしておきます。
いくつかのグーグルとテストの後、私は最終的に次のようにそれをすることができました:
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
に設定する必要があります。
結果:
これを行う簡単な方法があるかどうかはわかりませんが、私にとってはうまくいくように思えませんでした。