【问题标题】:How to set WPF window position in secondary display如何在辅助显示中设置 WPF 窗口位置
【发布时间】:2012-04-02 06:56:33
【问题描述】:

我有两个显示器。我想做一个媒体播放器,我想在我的辅助显示器上全屏播放视频。所以我正在尝试使用 WPF 制作一个媒体播放器

这是我目前写的代码

Screen[] _screens = Screen.AllScreens;
System.Drawing.Rectangle ractagle = _screens[1].Bounds;
//player is  my window
player.WindowState = WindowState.Maximized;
player.WindowStyle = WindowStyle.None;

player.Left = ractagle.X;
player.Top = ractagle.Y;


// MediaControl is an media elements
MediaControl.Height = ractagle.Height;
MediaControl.Width = ractagle.Width;

但不知何故,它只是在我的第一个显示器上播放。 非常感谢任何形式的帮助。

【问题讨论】:

    标签: c# .net wpf media-player mediaelement


    【解决方案1】:

    您需要确保您正在显示的表单将WindowStartupLocation 设置为Manual

    否则你所做的任何事情都不会影响窗口的位置。

    using System.Windows.Forms;
    // reference System.Drawing
    //
    
    Screen s = Screen.AllScreens[1];
    
    System.Drawing.Rectangle r  = s.WorkingArea;
    Me.Top = r.Top;
    Me.Left = r.Left;
    

    我使用的 Window 的 XAML 标头。

    <Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="823" WindowStartupLocation="Manual">
        <Canvas Width="743">
            //Controls etc
        </Canvas>
    </Window>
    

    【讨论】:

    • 嘿它不起作用,我仔细检查了,我设置了 WindowStartupLocation 手册
    • 我敲了一个小样本来演示,它对我有用。什么不工作?请参阅我使用的 XAML 的编辑。
    • 不错的解决方案。但是,它只会在辅助屏幕上为您提供全屏窗口(您仍然可以看到窗口边框等)。万一其他人偶然发现这篇文章并想要全屏显示,我在这里找到了解决方案:mostlytech.blogspot.de/2008/01/…
    【解决方案2】:

    5 年后!但是对于像我一样偶然发现这一点的其他人......

    如果您不能或不想添加整个 System.Windows.Forms dll 引用,您可以使用WpfScreenHelper by micdenny(在 NuGet 中搜索)

      Screen screen = WpfScreenHelper.AllScreens[0];
      Left = screen.Bounds.Left;
      Top = screen.Bounds.Top;
      Width = screen.Bounds.Width;
      Height = screen.Bounds.Height;
    

    Midenny 已为 WPF 移植了 Windows 窗体屏幕帮助程序。当您有其他 WPF 引用不能很好地与 Forms(如 WPF Live-Charts)配合使用时,这非常好。

    【讨论】:

    • 不适合我,我必须更改代码才能编译。 (例如:屏幕屏幕 = Screen.AllScreens.ToList()[0]; ...)。无论如何,索引 0 到 1 的更改没有效果。它是否需要其他东西才能工作?我安装了 WpfScreenHelper 的 0.3.0(当前版本)。
    • @ExelGamboa 抱歉,它不适合您。就我而言,Nuget 安装得很好。然后我构建了一个仅使用 WpfScreenHelper 和泛型集合的 ScreenManager 类。我有“公共列表屏幕;”我在构造函数中填充了“Screens = new List(Screen.AllScreens);”然后我创建了一个方法“public Sc​​reen GetScreen(int index){ return Screens[index]; }”,然后使用从返回的“screen.Bounds”填充的 Rect 定位和调整应用程序的大小。我根本没有构建问题。您还安装/引用了什么?也许某处有冲突?
    • 也许这是真的。谢谢你的详细信息,我会再试一次,看看我是否做了不同的事情。
    • 如果辅助监视器的缩放比例或 DPI 与主监视器不同,则此方法可能会出现问题。不过,在相同的显示器上,这可以完美运行。
    【解决方案3】:

    我在 VS 2019 中使用以下内容:

    private void MaximizeToSecondaryScreen()
    {
        this.Left = SystemParameters.VirtualScreenLeft;
        this.Top = SystemParameters.VirtualScreenTop;
        this.Height = SystemParameters.VirtualScreenHeight;
        this.Width = SystemParameters.VirtualScreenWidth;
    }
    

    【讨论】:

    • 了解这一点很有用,如果其他显示器的尺寸不同并且具有不同的 DPI/比例因子,则有关此主题的一些先前答案将不起作用。
    【解决方案4】:

    如果您将窗口设置为立即最大化,它将不起作用。 使用加载的事件,您将不需要 Windows 窗体

    var secondaryScreenLeft = SystemParameters.PrimaryScreenWidth - SystemParameters.VirtualScreenWidth;
    
    window.WindowStartupLocation = WindowStartupLocation.Manual;
    window.Left = secondaryScreenLeft ;
    window.Top = 0;
    window.Loaded += Window_Loaded;
    
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        var senderWindow = sender as Window;
        senderWindow.WindowState = WindowState.Maximized;
    }
    

    【讨论】:

      【解决方案5】:

      我的解决方案结合了这些想法并确保存在辅助屏幕:

          using System.Linq;
          // ...
          public partial class MainWindow : Window
          {
              public MainWindow()
              {                
                  InitializeComponent();
      
                  var screens = System.Windows.Forms.Screen.AllScreens;
                  var firstSecondary = screens.FirstOrDefault(s => s.Primary == false);
                  if (firstSecondary != null)
                  {
                      WindowStartupLocation = WindowStartupLocation.Manual; 
                      // Ensure Window is minimzed on creation
                      WindowState = WindowState.Minimized; XAML
                      // Define Position on Secondary screen, for "Normal" window-mode
                      // ( Here Top/Left-Position )
                      Left = firstSecondary.Bounds.Left;
                      Top = firstSecondary.Bounds.Top;
                  }            
                  Loaded += MainWindow_Loaded;
              }    
      
              private void MainWindow_Loaded(object sender, RoutedEventArgs e)
              {
                  // Maximize after position is defined in constructor
                  WindowState = WindowState.Maximized;    
              }
           }
      

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-22
        • 1970-01-01
        • 2019-04-08
        • 2012-12-27
        相关资源
        最近更新 更多