WPFではウィンドウの表示位置を指定することができますが、
- 上からの位置 (top)
- 左からの位置 (left)
の2つしか設定することができません。
ディスプレイの「右側」にウィンドウを表示したい場合は、ちょっとコツがいります。
コード
先に結論からいうと、app.xaml.csに以下のコードを書くことで実現できます。
private void Application_Startup(object sender, StartupEventArgs e) { var mainWindow = new MainWindow(); var dispWidth = SystemParameters.PrimaryScreenWidth; var appWidth = mainWindow.Width; mainWindow.Top = 30; mainWindow.Left = dispWidth - appWidth - 30; mainWindow.ShowDialog(); }
詳しく解説しますね。
解説
app.xamlの設定
このコードは、メインウィンドウを開くとき、ディスプレイの右上に表示するように指示しています。
※以下、メインウィンドウの名前が「MainWindow」であるという前提で書きます。
まず、MainWindowの表示位置の設定をapp.xaml.csに書けるようにする必要があります。
そのためには、ちょっとした設定が必要です。
「MainWindowを開く前に、app.xaml.csのスタートメソッドを実行してくさだい」と書いてあげましょう。
手順
- App.xamlファイルを開きます。
- App.xamlを開くと、「Application~」という記述があるので、その中に「Startup」と入力します。
- 下記画像のように入力すると「新しいイベントハンドラー」という表示が出ると思うので、それをクリックします。
- 「新しいイベントハンドラー」をクリックします。すると、自動的に「Application_Startup」と入力されるはずです。
- App.xaml.csを開きます。
- 連動して「Application_Startup」メソッドが挿入されていることを確認します。
この「Application_Startup」メソッドに書いた処理は、MainWindow が表示される前に実行されます。
MainWindowが開く前に実行してほしい処理や、MainWindow自体の設定をここに書くことができます。
コードの意味
コードには、
- MainWindowを、ディスプレイの右から30px、上から30pxの位置に表示する
という設定が記述されています。 1行ずつ解説を入れると下記のようになります。
private void Application_Startup(object sender, StartupEventArgs e) { //MainWindowのインスタンス化 var mainWindow = new MainWindow(); //ディスプレイの幅を取得 var dispWidth = SystemParameters.PrimaryScreenWidth; //MainWindowの幅を取得 var appWidth = mainWindow.Width; //MainWindowを表示する縦位置を指定 mainWindow.Top = 30; //MainWindowを表示する横位置を指定 mainWindow.Left = dispWidth - appWidth - 30; //MainWindowを表示 mainWindow.ShowDialog(); }
まずは、
var dispWidth = SystemParameters.PrimaryScreenWidth;
ですが、これはディスプレイの幅を取得しています。
「PrimaryScreenWidth」と書いてある通り、メインモニターの幅を取得できます。
ディスプレイの幅ではなく高さを取得したい場合は「SystemParameters.PrimaryScreenHeight」を使います。
高さを取得する場合:var dispHeight = SystemParameters.PrimaryScreenHeight;
次に下記のコードです。
mainWindow.Top = 30; mainWindow.Left = dispWidth - appWidth - 30;
ここでは、MainWindowの表示位置を指定しています。
「Top = 30」というのは、ディスプレイの上辺から30pxの位置に表示するという意味です。
Left = dispWidth - appWidth - 30
上記が少しわかりづらいかもしれません。
ディスプレイの幅からアプリの幅を引き、さらにそこから30px引いています。
Leftは、MainWindowの左辺の位置です。
例えば、
- ディスプレイ幅=1980px
- ウィンドウ幅=800px
- ディスプレイ右辺とウィンドウ右辺の間の余白=30px
の場合、Leftの位置は下記のように計算できます。
1980px – 800px – 30px = 1150px
そして最後に「ShowDialog」でメインウィンドウを表示すると、ウィンドウがディスプレイ上から30px、右から30pxの位置に表示されます。
このように、ウィンドウをディスプレイの右や下を基準にして表示したい場合、
ディスプレイ幅とウィンドウ幅を取得しなければならない、少し面倒な処理が必要でした。
何か理由があるのかもしれませんが、RightとBottomがあればラクなのになぁ……と思います。
参考
WPF:Mainメソッドを書き変えるには?[C#/VB]
C#のWPFでMainメソッドを編集する
How to set the location of WPF window to the bottom right corner of desktop?
WPF でマルチモニターの領域サイズやプライマリモニターの解像度を取得する