WPF中的双监视器双窗口应用程序

问题描述 投票:2回答:4

我正在尝试使用媒体元素创建wpf视频播放器。我的目标是为该应用程序制作多个窗口。每个窗口将显示在不同的监视器上。就像MainWindow一样,它将获得主监视器的分辨率并调整其大小以进入全屏状态。辅助监视器上的第二个窗口等等...

到目前为止,我已经在主监视器上将MainWindow全屏显示。但我不知道如何在第二台显示器上以其分辨率显示第二个窗口。请帮助。

c# wpf multiple-monitors
4个回答
6
投票

最简单的选择是显示它。然后在show()方法之后,调整其大小。

            // display on second window
        NewWindow win = new NewWindow();
        System.Windows.Forms.Screen s1 = System.Windows.Forms.Screen.AllScreens[2];

        System.Drawing.Rectangle r1 = s1.WorkingArea;
        win.WindowState = System.Windows.WindowState.Normal;
        win.WindowStartupLocation = System.Windows.WindowStartupLocation.Manual;
        win.Top = r1.Top;
        win.Left = r1.Left;

        win.Show();
        win.WindowState = System.Windows.WindowState.Maximized;

0
投票

每个屏幕在空间中都有坐标,实际上您没有在另一个屏幕的坐标处将窗口放置在另一个屏幕上。

在本机上,-1280,0是左监视器,0,0是主监视器,而1280,0是右监视器。不了解多屏操作的程序通常对此没有问题,尽管足够多的旧东西放在左侧监视器上时可能会做一些奇怪的事情(尝试使弹出窗口不偏离屏幕边缘,而不会意识到负面影响坐标可见。)

关于屏幕的定位,请参见:How to easily find screen location of form Location in multi-monitor environment?


0
投票

您可以尝试这样的事情:

    private System.Windows.Forms.Screen findScreen(string screenName) {
        System.Windows.Forms.Screen res = System.Windows.Forms.Screen.AllScreens.FirstOrDefault(s => s.DeviceName == screenName);
        if (res == null)
            res = System.Windows.Forms.Screen.AllScreens[0];
        return res;
    }


    private void setupForms() {
        System.Windows.Forms.Screen mainScreen = findScreen(@"\\.\DISPLAY2");
        FrmMain frmMain = new FrmMain()
        {
            WindowStartupLocation = WindowStartupLocation.Manual,
            WindowState = System.Windows.WindowState.Normal,
            Left = mainScreen.WorkingArea.Left,
            Top = mainScreen.WorkingArea.Top,
            Width = mainScreen.WorkingArea.Width,
            Height = mainScreen.WorkingArea.Height
        };

        System.Windows.Forms.Screen secondaryScreen = findScreen(@"\\.\DISPLAY1");
        FrmSecondary frmSecondary = new FrmSecondary()
        {
            WindowStartupLocation = WindowStartupLocation.Manual,
            WindowState = System.Windows.WindowState.Normal,
            Left = secondaryScreen.WorkingArea.Left,
            Top = secondaryScreen.WorkingArea.Top,
            Width = secondaryScreen.WorkingArea.Width,
            Height = secondaryScreen.WorkingArea.Height
        };


    }

0
投票

我将更新@romanoza的答案

private void SetupWindows()
    {
        System.Windows.Forms.Screen mainScreen = Screen.AllScreens[0]; ;
        WinLeft leftWin = new WinLeft()
        {
            WindowStartupLocation = WindowStartupLocation.Manual,
            WindowState = System.Windows.WindowState.Normal,
            Left = mainScreen.WorkingArea.Left,
            Top = mainScreen.WorkingArea.Top,
            Width = mainScreen.WorkingArea.Width,
            Height = mainScreen.WorkingArea.Height
        };           

        System.Windows.Forms.Screen secondaryScreen = Screen.AllScreens[1];
        WinRight rightWin = new WinRight()
        {
            WindowStartupLocation = WindowStartupLocation.Manual,
            WindowState = System.Windows.WindowState.Normal,
            Left = secondaryScreen.WorkingArea.Left,
            Top = secondaryScreen.WorkingArea.Top,
            Width = secondaryScreen.WorkingArea.Width,
            Height = secondaryScreen.WorkingArea.Height
        };


        leftWin.Show();
        leftWin.WindowState = WindowState.Maximized;
        rightWin.Show();
        rightWin.WindowState = WindowState.Maximized;
        rightWin.Owner = leftWin;
    }
© www.soinside.com 2019 - 2024. All rights reserved.