WPF에서 메인 창을 중앙에 배치하려면 어떻게 해야 합니까?
WPF 어플리케이션을 사용하고 있으며 (XAML이 아닌) Wain 창을 프로그램적으로 중앙에 배치하는 방법을 알아야 합니다.
시작 시 및 특정 사용자 이벤트에 대한 응답 모두에서 이 작업을 수행할 수 있어야 합니다.창 크기 자체가 동적이기 때문에 동적으로 계산해야 합니다.
가장 간단한 방법은 무엇일까요?이전 Win32 코드에서는 시스템 메트릭 함수를 호출하여 모든 문제를 해결했습니다.아직도 그렇게 하는 거야? 아니면 단순하게 하는 거야?CenterWindowOnScreen()
호출할 수 있는 함수입니다.
기동 시간의 경우는, 기동 장소를 설정할 수 있습니다.
window.WindowStartupLocation = WindowStartupLocation.CenterScreen;
나중에 문의해야 합니다.정보는(적어도 기본 화면용) SystemParameters를 통해 사용할 수 있습니다.프라이머리 화면 폭/높이
private void CenterWindowOnScreen()
{
double screenWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
double screenHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
double windowWidth = this.Width;
double windowHeight = this.Height;
this.Left = (screenWidth / 2) - (windowWidth / 2);
this.Top = (screenHeight / 2) - (windowHeight / 2);
}
이 방법을 사용하여 창 위치를 화면 중앙으로 설정할 수 있습니다.
쉽게 설정할 수 있지 않나요?
WindowStartupLocation="CenterScreen"
창의 XAML 정의.
이 경우 모든 근거를 커버하기 위해 다음 몇 가지 답변을 조합해야 했습니다.
- 프라이머리 모니터가 아닌 현재의 모니터를 찾는 Peter의 방법(직장에서는 모니터가 1대밖에 없는 사람이 있습니까?)
- @Wild_A의 방법
workarea
그보다는screen bounds
태스크바 공간을 고려합니다. - 특히 1280x800을 1024x640으로 표시하는 태블릿의 경우 DPI 스케일링을 추가해야 했지만, 엣지 케이스를 커버하는 데 도움이 되기 때문에 이에 대한 해답을 찾았습니다.주의:
dpiScaling
UI가 표시되기 전에 첫 번째 로드 시 호출되는 변수는 null입니다(여기 설명).
//get the current monitor
Screen currentMonitor = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(Application.Current.MainWindow).Handle);
//find out if our app is being scaled by the monitor
PresentationSource source = PresentationSource.FromVisual(Application.Current.MainWindow);
double dpiScaling = (source != null && source.CompositionTarget != null ? source.CompositionTarget.TransformFromDevice.M11 : 1);
//get the available area of the monitor
Rectangle workArea = currentMonitor.WorkingArea;
var workAreaWidth = (int)Math.Floor(workArea.Width*dpiScaling);
var workAreaHeight = (int)Math.Floor(workArea.Height*dpiScaling);
//move to the centre
Application.Current.MainWindow.Left = (((workAreaWidth - (myWindowWidth * dpiScaling)) / 2) + (workArea.Left * dpiScaling));
Application.Current.MainWindow.Top = (((workAreaHeight - (myWindowHeight * dpiScaling)) / 2) + (workArea.Top * dpiScaling));
어디에myWindowWidth
그리고.myWindowHeight
이 변수는 앞에서 창의 크기를 수동으로 설정하는 데 사용한 변수입니다.
Rect workArea = System.Windows.SystemParameters.WorkArea;
this.Left = (workArea.Width - this.Width) / 2 + workArea.Left;
this.Top = (workArea.Height - this.Height) / 2 + workArea.Top;
여기에는 태스크바 크기가 고려됩니다(사용 시).System.Windows.SystemParameters.WorkArea
(추가함으로써) 및 위치workArea.Left
그리고.workArea.Top
)
다중 화면 환경에서 창을 그려야 하는 경우.다음 메서드를 재사용할 수 있는 정적 클래스를 만들었습니다.
public static void PostitionWindowOnScreen(Window window, double horizontalShift = 0, double verticalShift = 0)
{
Screen screen = Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(window).Handle);
window.Left = screen.Bounds.X + ((screen.Bounds.Width - window.ActualWidth) / 2) + horizontalShift;
window.Top = screen.Bounds.Y + ((screen.Bounds.Height - window.ActualHeight) / 2) + verticalShift;
}
이제 Window 생성자에서 메서드를 호출합니다.
this.Loaded += (s, a) => Globals.PostitionWindowOnScreen(this, 0, 0)
기본 솔루션으로 창의 StartupLocation 속성을 사용하여 시스템에 정의된 열거 값 중 하나로 설정할 수 있습니다.창문들.Window Startup Location 열거. 화면 중앙에 다음 항목이 있습니다.
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen;
유감스럽게도 그렇게 간단한 것은 아닙니다.여러 모니터, 태스크바 등을 고려해야 합니다."CenterScreen" 옵션을 선택하면 마우스 커서가 있는 화면 중앙에 창이 열립니다.자세한 내용은 이 SO 질문을 참조하거나 api를 참조하십시오.
window 요소에서 다음 Atribute-Value 쌍을 추가합니다.Window Startup Location="Center Screen"
내 앱에서 사용하고 있는 것은 여러 디스플레이 및 다른 DPI 설정에서 작동합니다.
//center a window on chosen screen
public static void CenterWindow(Window w, System.Windows.Forms.Screen screen = null)
{
if(screen == null)
screen = System.Windows.Forms.Screen.PrimaryScreen;
int screenW = screen.Bounds.Width;
int screenH = screen.Bounds.Height;
int screenTop = screen.Bounds.Top;
int screenLeft = screen.Bounds.Left;
w.Left = PixelsToPoints((int)(screenLeft + (screenW - PointsToPixels(w.Width, "X")) / 2), "X");
w.Top = PixelsToPoints((int)(screenTop + (screenH - PointsToPixels(w.Height, "Y")) / 2), "Y");
}
public static double PixelsToPoints(int pixels, string direction)
{
if (direction == "X")
{
return pixels * SystemParameters.WorkArea.Width / System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width;
}
else
{
return pixels * SystemParameters.WorkArea.Height / System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height;
}
}
public static double PointsToPixels(double wpfPoints, string direction)
{
if (direction == "X")
{
return wpfPoints * System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width / SystemParameters.WorkArea.Width;
}
else
{
return wpfPoints * System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height / SystemParameters.WorkArea.Height;
}
}
컴퓨터 화면 중앙에 메인 윈도우를 렌더링하기 위한 또 다른 간단한 방법은 뒤에 있는 코드를 사용하는 것입니다.
this.Left = (System.Windows.SystemParameters.PrimaryScreenWidth - this.Width)/2;
this.Top = (System.Windows.SystemParameters.PrimaryScreenHeight - this.Height)/2;
@ @Wild_A에 했습니다.SizeChanged
이치노
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
try
{
Rect workArea = SystemParameters.WorkArea;
this.Left = (workArea.Width - e.NewSize.Width) / 2 + workArea.Left;
this.Top = (workArea.Height - e.NewSize.Height) / 2 + workArea.Top;
}
catch (Exception ex) { ... Handel exception; }
}
사용방법:
WindowStartupLocation="CenterScreen"
또한 가로/세로 가운데에만 배치하려는 경우 OnActivated 메서드를 재정의하고 다음과 같이 왼쪽 또는 위쪽을 0으로 설정할 수 있습니다.
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
// to center Vertically
Left = 0;
// or user top = 0 to center Horizontally
//top = 0;
}
Main Window.xaml 속성 창으로 이동합니다.
- 공통 범주에서 WindowStartupLocation 속성 찾기
- 드롭다운에서 Center Screen 옵션을 선택합니다.
- 응용 프로그램 실행
전체 화면용
Main Window.xaml 속성 창으로 이동합니다.
- 공통 범주에서 WindowState 속성 찾기
- 드롭다운에서 최대화 옵션 선택
- 응용 프로그램 실행
양호한 품질의 확장 코드를 복사하여 붙여넣습니다.
실행 시:
using System;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;
namespace Extensions
{
/// <summary>
/// <see cref="Window"/> extensions.
/// </summary>
public static class WindowExtensions
{
/// <summary>
/// Moves the window to the center of the current screen, also considering dpi.
/// </summary>
/// <param name="window"></param>
/// <exception cref="ArgumentNullException"></exception>
public static void MoveToCenter(this Window window)
{
window = window ?? throw new ArgumentNullException(nameof(window));
var helper = new WindowInteropHelper(window);
var screen = Screen.FromHandle(helper.Handle);
var area = screen.WorkingArea;
var source = PresentationSource.FromVisual(window);
var dpi = source?.CompositionTarget?.TransformFromDevice.M11 ?? 1.0;
window.Left = dpi * area.Left + (dpi * area.Width - window.Width) / 2;
window.Top = dpi * area.Top + (dpi * area.Height - window.Height) / 2;
}
}
}
초기 위치:
<Window WindowStartupLocation="CenterScreen">
</Window>
Title="MainWindow" Height="450" Width="800" 행을 찾아야 합니다.
여기에 WindowStartupLocation="CenterScreen" 행을 추가합니다.
작업 내용 : 제목 = "Main Window" 높이 = "450" 폭 = "800" Window Startup Location = "Center Screen" >
나중에 고마워 ♥
할 수
=this.WindowState = " " " 。 State창 상태최대화
언급URL : https://stackoverflow.com/questions/4019831/how-do-you-center-your-main-window-in-wpf
'programing' 카테고리의 다른 글
Swift 5.1로 컴파일된 모듈은 Swift 5.1.2 컴파일러에서 가져올 수 없습니다. (0) | 2023.04.09 |
---|---|
git에서 복제된 프로젝트에서 버전 추적을 제거하려면 어떻게 해야 합니까? (0) | 2023.04.09 |
USIMageView를 비례적으로 확장하는 방법 (0) | 2023.04.09 |
Git 저장소에 이미 커밋된 파일 무시 (0) | 2023.04.09 |
swift range를 [Int]로 변환합니다. (0) | 2023.04.09 |