2013-07-31 1 views
1

으로 극대화는, 내가이 창을 최대화 할 때 고정이와 왼쪽 화면 국경 부두, WPF 창 내 WPF 창에서 고정/제한 폭

Width="300" MinWidth="300" MaxWidth="300" 

을 설정할 수 있지만 한의 하단 부분 창이 UNDERNEATH Windows 8 작업 표시 줄입니다.

나는

public MainWindow() 
{ 
    ... 
    this.MaxHeight = System.Windows.SystemParameters.WorkArea.Height; 
} 

을 시도하지만,이 작업 표시 줄 및 내 응용 프로그램 사이의 여유 공간이 몇 픽셀을 초래한다.

내가 좋아하는 것

  • 이 최대화 된 상태에서 작업 표시 줄에서 이동/
  • 이 적용되지 극대화
  • 가 오른쪽 테두리에 도킹 고정 폭 창을 가지고

답변

5

아쉽게도 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; 
}