아쉽게도 MinWidth, MaxWidth 및 WindowState를 사용하여 세 가지 요구 사항을 달성 할 수없는 것 같습니다.
하지만 상관없이 비슷한 결과를 얻을 수 있습니다. 당신이해야 할 일은 윈도우의 최대화 된 상태를 에뮬레이트하는 것입니다. 창을 올바른 위치로 옮기고 올바른 높이를 얻은 다음 움직일 수 없게해야합니다. 첫 번째 두 부분은 쉽고, 마지막 부분은 좀 더 고급 기능이 필요합니다.
너비, 최대 너비 및 최소 너비가 300으로 설정된 창 밖으로 시작하고 StateChanged에 이벤트 처리기를 추가하십시오.
Width="300" MinWidth="300" MaxWidth="300" StateChanged="MainWindow_OnStateChanged"
그리고 이벤트 핸들러 및 도우미 방법 :
private bool isMaximized;
private Rect normalBounds;
private void MainWindow_OnStateChanged(object sender, EventArgs e)
{
if (WindowState == WindowState.Maximized && !isMaximized)
{
WindowState = WindowState.Normal;
isMaximized = true;
normalBounds = RestoreBounds;
Height = SystemParameters.WorkArea.Height;
MaxHeight = Height;
MinHeight = Height;
Top = 0;
Left = SystemParameters.WorkArea.Right - Width;
SetMovable(false);
}
else if(WindowState == WindowState.Maximized && isMaximized)
{
WindowState = WindowState.Normal;
isMaximized = false;
MaxHeight = Double.PositiveInfinity;
MinHeight = 0;
Top = normalBounds.Top;
Left = normalBounds.Left;
Width = normalBounds.Width;
Height = normalBounds.Height;
SetMovable(true);
}
}
private void SetMovable(bool enable)
{
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
if(enable)
source.RemoveHook(WndProc);
else
source.AddHook(WndProc);
}
private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
const int WM_SYSCOMMAND = 0x0112;
const int SC_MOVE = 0xF010;
switch (msg)
{
case WM_SYSCOMMAND:
int command = wParam.ToInt32() & 0xfff0;
if (command == SC_MOVE)
handled = true;
break;
}
return IntPtr.Zero;
}