2012-11-05 137 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屬性,但沒有奏效。

啓動窗口從App.xaml.cs通過設置的StartupUri推出:

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]; 
    } 
}