【C#】WPFのウィンドウを画面右側に表示する方法 [PrimaryScreenWidth]

投稿者: | 2020年11月8日

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のスタートメソッドを実行してくさだい」と書いてあげましょう。

手順

  1. App.xamlファイルを開きます。
  2. App.xamlを開くと、「Application~」という記述があるので、その中に「Startup」と入力します。
  3. 下記画像のように入力すると「新しいイベントハンドラー」という表示が出ると思うので、それをクリックします。
Startupの設定
  1. 「新しいイベントハンドラー」をクリックします。すると、自動的に「Application_Startup」と入力されるはずです。
  2. App.xaml.csを開きます。
  3. 連動して「Application_Startup」メソッドが挿入されていることを確認します。

Startupの設定2

この「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 でマルチモニターの領域サイズやプライマリモニターの解像度を取得する


記事をシェアする