ウィンドウサイズの固定化はWindowのプロパティResizeModeをNoReseizeにすればよいのですが、最小化、最大化はできてしまいます。
完全にサイズ固定にしたい場合は、ウィンドウの最小化、最大化ボタンを非表示を消してしまいたいのですが、プロパティの設定だけではだめそうです。今回、最小化、最大化ボタンだけを消したいのでその解決方法を記述しておきます。
最小化、最大化ボタンを消す
オーバーライドしたOnSourceInitialized関数でウィンドウハンドルをWindowInteropHelperで取得します。このウィンドウハンドルからWindowのスタイルを取得して、最小化ボタン(WS_MINIMIZEBOX)と最大化ボタン(WS_MAXMIZEBOX)のフラグをOFFにします。
ちなみに、クローズボタンも無効にするにはWS_SYSMENUをOFFにすればOKです。
using System.Management;
using System.Threading;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices;
public partial class MainWindow : Window
{
[DllImport("user32.dll")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
const int GWL_STYLE = -16;
const int WS_SYSMENU = 0x80000;
const int WS_MAXIMIZEBOX = 0x10000;
const int WS_MINIMIZEBOX = 0x20000;
public MainWindow()
{
InitializeComponent();
}
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
IntPtr handle = new System.Windows.Interop.WindowInteropHelper(this).Handle;
int style = GetWindowLong(handle, GWL_STYLE);
style = style & (~(WS_MAXIMIZEBOX|WS_MINIMIZEBOX));
SetWindowLong(handle, GWL_STYLE, style);
}
:
}