2012-11-05 4 views
4

전용 창을 통해 프로젝터에 대한 정보를 표시하는 WPF 응용 프로그램이 있습니다. 프로젝터 디스플레이에 사용할 화면과 주 응용 프로그램 창에 사용할 화면을 구성하고 싶습니다. 지금까지 성공하지 않고 내가 시작 폼과 같은 트릭을 할 시도WPF 시작 창을 특정 화면으로 강제 설정하는 방법은 무엇입니까?

var screen = GetProjectorScreen(); 
_projectorWindow = new ProjectorWindow(); 
_projectorWindow.Left = screen.WorkingArea.Left; 
_projectorWindow.Top = screen.WorkingArea.Top; 
_projectorWindow.Owner = _parentWindow; 
_projectorWindow.Show(); 


public static Screen GetProjectorScreen() 
{ 
    var screens = Screen.AllScreens; 
    if (screens.Length > 1 && Settings.Default.DisplayScreen < screens.Length) 
    { 
     return screens[Settings.Default.DisplayScreen]; 
    } 
    return screens[0]; 
} 

:하지만,

이 코드는 지정된 화면에 프로젝터 출력을 생성합니다. MainWindow 생성자에서 Top 및 Left 속성을 설정하려고했지만 작동하지 않았습니다.

시작 창은 StartupUri를 설정하여 App.xaml.cs를에서 시작됩니다 : 시작 양식을 시작하는 다른 방법이

StartupUri = new Uri("Windows/MainWindow.xaml", UriKind.Relative); 

있습니까? 그냥 생성자를 호출하려고했지만 일부 리소스가 더 이상로드되지 않아 충돌이 발생합니다.

+0

한 주요 문제는 마음에 온천 - 당신은 어떻게 컴퓨터에 연결된 프로젝터가 있음을 알 수 있습니까? 프로젝터가 없다면 어떻게 될까요? – ChrisF

답변

10

나는 그것을 작동시켰다. 창 위치를 설정하기 전에 WindowState를 Normal로 설정해야합니다. 그리고 윈도우가 생성 될 때까지, 즉 생성자 호출 후에 설정이 전혀 작동하지 않습니다. 따라서 Windows_Loaded 이벤트에서 명시적인 설정을 호출합니다. 창을 옮겨야하는 경우 깜빡 거리는 소리가 들릴 수도 있지만 그건 나에게 받아 들일 만합니다.

SetScreen 메서드는 사용자가 수동으로 화면 설정을 변경 한 후에 호출해야합니다.

private void SetScreen() 
{ 
    var mainScreen = ScreenHandler.GetMainScreen(); 
    var currentScreen = ScreenHandler.GetCurrentScreen(this); 
    if (mainScreen.DeviceName != currentScreen.DeviceName) 
    { 
     this.WindowState = WindowState.Normal; 
     this.Left = mainScreen.WorkingArea.Left; 
     this.Top = mainScreen.WorkingArea.Top; 
     this.Width = mainScreen.WorkingArea.Width; 
     this.Height = mainScreen.WorkingArea.Height; 
     this.WindowState = WindowState.Maximized; 
    } 
} 

백업 ScreenHandler 유틸리티

은 매우 간단합니다 :

public static class ScreenHandler 
{ 
    public static Screen GetMainScreen() 
    { 
     return GetScreen(Settings.Default.MainScreenId); 
    } 

    public static Screen GetProjectorScreen() 
    { 
     return GetScreen(Settings.Default.ProjectorScreenId); 
    } 

    public static Screen GetCurrentScreen(Window window) 
    { 
     var parentArea = new Rectangle((int)window.Left, (int)window.Top, (int)window.Width, (int)window.Height); 
     return Screen.FromRectangle(parentArea); 
    } 

    private static Screen GetScreen(int requestedScreen) 
    { 
     var screens = Screen.AllScreens; 
     var mainScreen = 0; 
     if (screens.Length > 1 && mainScreen < screens.Length) 
     { 
      return screens[requestedScreen]; 
     } 
     return screens[0]; 
    } 
} 
관련 문제