1. ホーム
  2. c#

[解決済み】WPFウィンドウのクローズボタンを非表示にするには?

2022-04-08 06:53:21

質問

WPFでモーダルダイアログを書いています。WPFのウィンドウに閉じるボタンをつけないようにするには、どうしたらよいでしょうか。私はまだ、その WindowState には、通常のタイトルバーがあります。

私が見つけたのは ResizeMode , WindowState および WindowStyle しかし、これらのプロパティは、モーダルダイアログのように、閉じるボタンを隠してタイトルバーを表示することを可能にするものではありません。

どうすればいいですか?

WPFにはタイトルバーの閉じるボタンを隠すための組み込みのプロパティはありませんが、数行のP/Invokeでそれを実現することができます。

まず、Windowクラスに以下の宣言を追加します。

private const int GWL_STYLE = -16;
private const int WS_SYSMENU = 0x80000;
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

次に、このコードを Window の Loaded イベントが発生します。

var hwnd = new WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);

これで、閉じるボタンがなくなりました。また、タイトルバーの左側にウィンドウのアイコンも表示されないので、タイトルバーを右クリックしてもシステムメニューが表示されません - これらはすべて一緒です。

重要なお知らせです。 は、ボタンを隠すだけです。 ユーザーはまだウィンドウを閉じることができます もしユーザーが Alt + F4 またはタスクバーからアプリを閉じても、ウィンドウは閉じます。

バックグラウンドスレッドが終了する前にウィンドウを閉じることを許可しない場合は OnClosing を設定し Cancel Gabeが提案したように、trueに設定します。