반응형
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);
}
}
}
반응형
'C# > WinUI3' 카테고리의 다른 글
[C#][WinUI3] 데이터 바인딩 시, 갱신되지 않는 문제 해결 (INotifyPropertyChanged) (0) | 2023.06.19 |
---|
댓글