C#/WPF

WPF WindowStyle None 최대화 시 작업 표시줄 보이게 하기

기공이 2018. 4. 26. 15:23

WPF에서 WindowStyle을 None으로 설정하고 Maximize를 하면 화면 전체를 가득 채워서 작업 표시줄까지 가리게 됩니다.


이럴 경우에는 MaxHeight를 통해 최대 크기를 제한해주면 작업 표시줄을 가리지 않게 됩니다.


하지만 사용자의 모니터가 여러대이면서 각 모니터의 해상도가 다를 경우에는 모니터마다 MaxHeight를 바꿔주어야 합니다.



먼저 모니터가 1개이거나 모든 모니터의 해상도가 같을 때 MaxHeight를 설정하는 법입니다.


1
2
3
4
5
6
public MainWindow()
{
    InitializeComponent();
    
    MaxHeight = SystemParameters.WorkArea.Height;
}
cs



생성자 또는 Loaded 이벤트에서 MaxHeight를 설정해 줍니다.


SystemParameters 는 시스템의 정보를 가지고 있으며 WorkArea는 클라이언트가 사용 가능한 크기를 알려줍니다.




모니터가 2개 이상이고, 모니터의 해상도가 다를 때에 설정하는 법입니다.


우선 어셈블리 참조가 필요합니다.


※참조 추가 -> 어셈블리 -> System.Drawing , System.Windows.Forms 



코드 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
System.Windows.Forms.Screen[] screens = System.Windows.Forms.Screen.AllScreens;
 
private void Window_LocationChanged(object sender, EventArgs e)
{
    int sum = 0;
    foreach (var item in screens)
    {
        sum += item.WorkingArea.Width;
        if (sum >= this.Left + this.Width / 2)
        {
            this.MaxHeight = item.WorkingArea.Height;
            break;
        }
    }
}
cs


먼저 멤버 변수로 현 사용자의 모든 모니터들의 상태를 갖고옵니다. (굳이 멤버변수가 아니여도 됩니다.)


그리고 Window의 LocationChanged Event를 통해 Window가 이동할 때마다 어떤 모니터에 있는지를 확인합니다.



Window가 어떤 모니터에 있는지의 기준은 각 Window의 중앙 부분 입니다.


sum 은 모니터들의 왼쪽 끝 부터 오른쪽 끝까지의 합입니다.


현재 Window의 중앙은 Left 값 + Width의 반 입니다.


그래서 sum보다 작다면 현재 더하게 된 Screen 안에 있다는 뜻이므로 현재 더한 item의 WorkingArea의 Height를

MaxHeight로 설정하고, 반복문을 나가게 됩니다.




이 방법으로 되지 않는 케이스도 있겠지만 대부분의 상황에서는 적용될 것입니다.