代码之家  ›  专栏  ›  技术社区  ›  Josip Medved

确保WPF窗口在屏幕边界内

wpf
  •  5
  • Josip Medved  · 技术社区  · 16 年前

    System.Windows.Forms.Screen 收藏。在WPF的世界里有什么相似的东西吗?

    我注意到了 PrimaryScreen* , VirtualScreen* System.Windows.SystemParameters . 然而,他们让我挂起,因为它似乎是不可能的检测窗口是否在边界内的情况下,显示器是不一样的大小。

    1 回复  |  直到 16 年前
        1
  •  4
  •   Victor Chelaru    6 年前

    System.Windows.Forms.Screen 在WPF中工作得非常好,所以我认为WPF的设计者认为用WPF特定的版本来代替它没有任何优势。

    当然,你得做坐标变换。下面是一个简单的类来进行转换:

    public class ScreenBoundsConverter
    {
      private Matrix _transform;
    
      public ScreenBoundsConverter(Visual visual)
      {
        _transform =
          PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
      }
    
      public Rect ConvertBounds(Rectangle bounds)
      {
        var result = new Rect(bounds.X, bounds.Y, bounds.Width, bounds.Height);
        result.Transform(_transform);
        return result;
      }
    }
    

    用法示例:

    var converter = new ScreenBoundsConverter(this);
    
    foreach(var screen in System.Windows.Forms.Screen.AllScreens)
    {
      Rect bounds = converter.ConvertBounds(screen.Bounds);
      ...
    }