web-dev-qa-db-ja.com

WPF:ダイアログの位置を設定してアプリケーションの中央に表示する方法は?

.ShowDialog();から取得したDialogの位置を設定して、メインウィンドウの中央に表示する方法。

これは私が位置を設定しようとする方法です。

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

このように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;
}
30
Fredrik Hedblad

ダイアログに属するXAMLで:

<Window ... WindowStartupLocation="CenterOwner">

そして、C#でダイアログをインスタンス化するとき:

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

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

Xamlマークアップを使用する方が簡単だと思います

<Window WindowStartupLocation="CenterOwner">
42
The Smallest

コードビハインドで。

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

        WindowStartupLocation = WindowStartupLocation.CenterOwner;
        Owner = Application.Current.MainWindow;
    }
}
19
Rob Dunbar

この質問に対する全員の答えは、答えがどうあるべきかの一部だと思います。この問題に対する最も簡単でエレガントなアプローチであると私は信じています。

ウィンドウを配置する最初のセットアップ。ここが所有者です。

<Window WindowStartupLocation="CenterOwner">

ウィンドウを開く前に、所有者を与える必要があり、別の投稿から現在のアプリケーションのメインウィンドウの静的ゲッターを使用してメインウィンドウにアクセスできます。

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

それでおしまい。

16
Alex Ehlert

これが一番良かった

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

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)
{
    ...
3
Jason

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;
    }
2

親ウィンドウをウィンドウ(所有者)に設定し、WindowStartupLocationプロパティを「CenterParent」に設定する必要があります

2
Ugo Robain

表示する必要があるウィンドウをほとんど制御できない場合は、次のスニペットが役立つ場合があります

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

子ウィンドウの場合、XAMLで設定

WindowStartupLocation="CenterOwner"

子ウィンドウをダイアログおよび親の中心として呼び出すには、親ウィンドウから呼び出します(例:

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

XAML:

    <Window WindowStartupLocation="CenterScreen">
0
GET1NE

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」を使用できます。

0
Markus

ドキュメントのために、ここで似たようなことをどのように達成したかの例を追加します。必要なのは、親のウィンドウコンテンツ領域全体(タイトルバーを除く)をカバーするポップアップでしたが、ダイアログが常に下から少しオフセットされているため、ダイアログを中央に配置してコンテンツをストレッチするだけでは機能しませんでした。

ユーザーエクスペリエンスに関する注意:ボーダーレスダイアログが表示されているときに親ウィンドウをドラッグ/閉じることができないのは良くないので、使用を再検討します。また、この回答を投稿した後でこれを行わないことにしましたが、他の人が見ることができるようにしておきます。

いくつかのグーグルとテストの後、私は最終的に次のようにそれをすることができました:

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はウィンドウであり、その所有者はメインアプリケーションウィンドウに設定されます。手動ポジショニングが機能するには、WindowStartupLocationManualに設定する必要があります。

結果:

No dialog showing

Modal dialog showing

これを行う簡単な方法があるかどうかはわかりませんが、私にとってはうまくいくように思えませんでした。

0
Shahin Dohan