본문 바로가기
C#/WinUI3

[C#][WinUI3] Window 크기 고정 및 기타 윈도우 설정 방법

by 부먹짱 2023. 5. 19.
반응형

WinUI3는 xaml에서 Window 사이즈를 고정할 수 없다.

그래서 코드 상으로 AppWindow를 가져와 설정해주어야 한다.

 

Window 설정 예제

크기를 고정하고 싶은 창의 AppWindow를 가져온다.

나는 아래 함수를 전역 함수로 만들어 모든 윈도우에서 사용하였다.

 

public static AppWindow GetAppWindow(Window window)
{
    IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
    var windowId = Win32Interop.GetWindowIdFromWindow(hWnd);
    var appWindow = AppWindow.GetFromWindowId(windowId);
    return appWindow;
}

 

사실 AppWindow를 가져오면 모든 준비가 끝났다.

xaml 에서 불가능한 창의 크기, 위치, 형태 등.... 다양한 설정을 할 수 있다.

 

namespace Sample
{
    using Microsoft.UI.Windowing;
    using Microsoft.UI.Xaml;

    public sealed partial class SampleWindow : Window
    {
        public SampleWindow()
        {
            this.InitializeComponent();

            var appWindow = WindowUtil.GetAppWindow(this);
            appWindow.Title = "예시 윈도우"; // 타이틀
            appWindow.Move(new PointInt32(0, 0)); // 창 위치
            appWindow.Resize(new SizeInt32 { Width = 400, Height = 600 }); // 창 크기
            ((OverlappedPresenter)appWindow.Presenter).IsAlwaysOnTop = true; // 창을 가장 위로 고정
            ((OverlappedPresenter)appWindow.Presenter).IsMaximizable = false; // 최대화 가능 여부
            ((OverlappedPresenter)appWindow.Presenter).IsResizable = false; // 크기 조정 가능 여부
            ((OverlappedPresenter)appWindow.Presenter).Maximize(); // 실행 시 창이 최대화 상태로 나타남
            appWindow.SetPresenter(AppWindowPresenterKind.FullScreen); // 화면 형태 설정
        }
    }
}

 

반응형

 

추가로 WinUI3에서는 사용자 커스텀 타이틀 바를 적용할 수 있는데

커스텀 타이틀 바를 사용할 경우 최대화 및 크기 조정 여부를 false로 설정해도 타이틀 바에는 적용이 안된다.

 

요게 타이틀 바

 

Resize의 경우 창의 가장자리에 마우스를 올려 조정하는건 막히지만

타이틀 바의 최대, 최소화 버튼이 비활성화 되지않는다.

 

Window 위치를 모니터 가운데로 설정하는 예제

추가로 Window를 가운데 고정하는 코드를 공유하고 이 글을 마친다.

이 함수 또한 전역으로 만들어 필요한 윈도우에 사용했다.

 

public static void CenterToScreen(Window window)
{
    IntPtr hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
    var windowId = Win32Interop.GetWindowIdFromWindow(hWnd);
    var appWindow = AppWindow.GetFromWindowId(windowId);

    if (appWindow is not null)
    {
        DisplayArea displayArea = DisplayArea.GetFromWindowId(windowId, DisplayAreaFallback.Nearest);
        if (displayArea is not null)
        {
            var CenteredPosition = appWindow.Position;
            CenteredPosition.X = ((displayArea.WorkArea.Width - appWindow.Size.Width) / 2);
            CenteredPosition.Y = ((displayArea.WorkArea.Height - appWindow.Size.Height) / 2);
            appWindow.Move(CenteredPosition);
        }
    }
}

 

 

반응형

댓글