确保WPF窗口在屏幕范围内

时间:2010-04-13 22:56:52

标签: wpf

我在应用程序启动时恢复Window的坐标。在Good-old-Windows-Forms中,我使用了System.Windows.Forms.Screen集合。 WPF世界中有类似的东西吗?

我确实注意到PrimaryScreen*中的VirtualScreen*System.Windows.SystemParameters个参数。然而,他们让我不知所措,因为在监视器尺寸不同的情况下,似乎无法检测Window是否在内部边界。

1 个答案:

答案 0 :(得分:4)

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 { Visual = this };

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