2017-02-08 13 views
1

似たような問題に関して多くの質問がありましたが、私の質問にはまだ答えが見つからないほど明確なものは見つかりませんでした。MainWindowと同じモニタでウィンドウを開く

ユーザは私のプログラムのMainWindowを移動することができます。もしあれば、別のモニタに移動することができます。 MainWindowに何かを追加するためにクリックすると、フォームを記入できるように新しいウィンドウが作成されます。

問題は、この新しいウィンドウが、MainWindowが現在位置している画面から開始するのではなく、OSのプライマリ画面から起動することです。

私はこの質問を見ました。 How to make a dialog(view) open up on the same monitor as the main windowを参照して、このケースでMainWindowのオーナーを設定したことを確認しました。だから私はWindow_Loaded方法新しいウィンドウに

Owner = Application.Current.MainWindow;

を追加しました。これはMainWindowと同じ画面にWindowをロードしますが、クラッシュすると、エラーが発生します。Cannot set Owner property after Dialog is shown.

当然、新しいウィンドウが表示される前にOwnerプロパティの設定を移動します。

contractAddwindow.Owner = Application.Current.MainWindow; contractAddwindow.ShowDialog();

しかしこれは、プライマリ画面上contractAddWindow開始、前と同じ問題があります。

私の質問は、メインウィンドウの代わりにMainWindowと同じモニタに新しいウィンドウを読み込ませるにはどうすればいいですか?

SetWindowScreen(this, GetWindowScreen(App.Current.MainWindow)); 

答えて

2

この方法を試してみてくださいWindowStartupLocation

からXAML:

WindowStartupLocation="CenterOwner" 

コードから:

WindowStartupLocation = WindowStartupLocation.CenterOwner; 
3

あなたが使用することができます:あなたはMainWindowと同じモニタ上に表示したいWindowのコンストラクタからこのようにそれを呼び出し、その後、

using System.Windows; 
using System.Windows.Forms; // Reference System.Drawing 

[...] 

public void SetWindowScreen(Window window, Screen screen) 
{ 
    if (screen != null) 
    { 
     if (!window.IsLoaded) 
     { 
      window.WindowStartupLocation = WindowStartupLocation.Manual; 
     } 

     var workingArea = screen.WorkingArea; 
     window.Left = workingArea.Left; 
     window.Top = workingArea.Top; 
    } 
} 

public Screen GetWindowScreen(Window window) 
{ 
    return Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(window).Handle); 
} 

をそして:

関連する問題