2009-12-23 50 views
4

我一直在試圖讓我的WPF應用程序跨越多個顯示器一段時間,現在幾乎有它的工作。WPF多功能顯示器問題 - WindowState

這個問題似乎出現時,我設置以下行:

win1.WindowState = WindowState.Maximized 

這將導致僅跨越主屏幕中的應用。

我的代碼如下:

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     Window1 win1 = new Window1(); 
     win1.WindowStartupLocation = WindowStartupLocation.Manual; 
     win1.Width = 2560; 
     win1.Height = 1024; 
     win1.Left = 0; 
     win1.Top = 0; 
     win1.Topmost = true; 
     win1.Background = new SolidColorBrush(Colors.Black); 
     win1.WindowStyle = WindowStyle.None; 
     win1.Show(); 
     win1.Focus(); 
    } 
} 

門窗1的內部:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 

    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     WindowState = WindowState.Maximized; 
    } 
} 

這個例子的工作原理,但沒有被最大化的窗口和應用程序的邊界依然可見。

在Application_Startup中包含最大化的減速度使監視器最大化爲主監視器。

這是爲什麼?

回答

11

首先要注意的是,「最大化」的概念與一臺顯示器相關聯,所以你不能在多個顯示器上真正擁有最大化的窗口。當然,在WPF中,您可以創建自己的窗口框架並在其中繪製任何您喜歡的窗口框架,所以如果您希望的話,您肯定可以讓用戶認爲窗口最大化並跨越多個屏幕。

還要注意,有可能跨越兩個顯示器用單一的矩形窗口中只有兩種情況:

  1. 兩個顯示器具有相同的高度,並且被配置成並排,或
  2. 兩臺顯示器具有相同的寬度,並配置爲高於和低於此值。

否則,您將需要使用兩個獨立的窗口來覆蓋兩個顯示器的整個表面,或使用包含未被任何顯示器覆蓋的區域的大窗口。

好吧,這裏是如何得到你需要你的窗口位置(S)的信息:

WPF本身並沒有提供一種方式來詢問您的監視器數量,決議,或相對位置。幸運的是,我們可以直接使用[DllImport]調用Win32。爲了讓顯示器的分辨率和佈局,只是:

  1. 聲明monitorInfo的結構在C#中的結構
  2. 申報EnumDisplayMonitors和GetMonitorInfo DllImports,無論是在USER32找到。dll
  3. 編寫一個方法,該方法調用EnumDisplayMonitors並傳遞一個委託來獲取監視器信息並將其返回到列表中。

這裏的基本思想是:

List<MONITORINFO> GetAllMonitorInfo() 
{ 
    var result = List<MONITORINFO>(); 
    EnumDisplayMonitors(null, null, 
    (hMonitor, hdcMonitor, lprcMonitor, dwData) => 
    { 
     var info = new MONITORINFO { cbSize = Marshall.Sizeof(typeof(MONITORINFO)) }; 
     GetMonitorInfo(hMonitor, ref info); 
     result.Add(info); 
    }, null); 
    return result; 
} 

一旦你的顯示器的座標,用你選擇的算法來選擇你要多少窗口(縣)創建和你想要什麼座標每一個。然後使用顯式大小和位置創建窗口。

注意,您可能需要使用rcWork而不是rcMonitor,這樣你就不會覆蓋開始菜單等

還要注意的是,在許多情況下,一些返回的座標將是負面的,對於例如,如果輔助監視器位於主監視器的左側。這不是一個問題:只要使用給定的座標,你的窗口就會出現在正確的位置。

+0

好的,我將使用多個窗口跨越多個顯示器,因爲我無法保證用戶將擁有的顯示器。 此外,我認爲你可以使用System.Windows.Forms.Screens命名空間來訪問屏幕信息。 乾杯, 米格 – Mig 2009-12-24 11:26:47

+2

是的,最好使用System.Windows.Forms.Screen類,而不是直接調用本地方法。 – 2009-12-27 04:27:14

-1

如果你總是可以假設你的第二個顯示器是在相同的分辨率主,你可以實現這樣的事情:

// Use this is you are concerned about the taskbar height 
Rect workArea = SystemParameters.WorkArea; 
this.Width = SystemParameters.PrimaryScreenWidth * 2; 
this.Height = workArea.Bottom; 
this.Left = 0; 
this.Top = 0; 

或者:

// Use this is you don't care about the taskbar height 
this.Width = SystemParameters.PrimaryScreenWidth * 2; 
this.Height = SystemParameters.PrimaryScreenHeight; 
this.Left = 0; 
this.Top = 0;