【问题标题】:WPF giving incorrect size valuesWPF 给出不正确的大小值
【发布时间】:2012-09-13 00:51:37
【问题描述】:

我有一个 WPF 应用程序,我试图在其中抓取 WindowsFormsHost 控件的屏幕。为此,我正在做一个 Graphics.CopyFromScreen。在我们测试过的大多数盒子上都可以完美运行,但是我们有一台机器无法获取正确的尺寸值。 WPF 给出的宽度和高度与控件的实际宽度和高度不匹配。窥探时,控件的 ActualWidth 和 ActualHeight 也会显示不正确的值。更进一步,当我窥探主窗口(最大化)时,我得到 1550 的 ActualWidth 和 840 的 ActualHeight,但我的屏幕分辨率是 1920x1080。我会理解边框、边距等会偏离几个像素,但是让 WPF 告诉我我的最大化窗口的宽度比实际屏幕短 370 像素,这是没有意义的。谁能解释这种行为?

以下是用于捕获控件图像的代码:

public static Bitmap CreateBitmapFromVisual(this FrameworkElement target)
{
    Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
    if (bounds.Width == 0 && bounds.Height == 0)
        return null;

    System.Windows.Point p0 = target.PointToScreen(bounds.TopLeft);
    System.Drawing.Point p1 = new System.Drawing.Point((int) p0.X, (int) p0.Y);
    Bitmap image = new Bitmap((int)bounds.Width, (int)bounds.Height);
    Graphics imgGraphics = Graphics.FromImage(image);
    imgGraphics.CopyFromScreen(p1.X, p1.Y, 0, 0, new System.Drawing.Size((int) bounds.Width, (int) bounds.Height));
    return image;
}

这里有一张图片可以更好地描述我在说什么:

如您所见,snoop 表示 WindowsFormsHost 的实际宽度和实际高度为 486x336。我记录的任何调试信息都说同样的话。但是,当我打印屏幕并在绘图中裁剪到控件时,实际尺寸为 608x423,相差很大。

作为进一步的更新,看起来 wpf 给出的宽度大约是实际宽度的 80%。对于控件和窗口都是如此。

【问题讨论】:

  • ActualHeight 和 ActualWidth 属性不是以像素为单位的,它们是独立于设备的单位。此外,您的 ActualHeight 和 ActualWidth 是比您预期的大还是小?
  • 更小。与上面问题中给出的主窗口示例一样,主窗口的实际宽度显示为 1550,此时宽度应该大一些
  • 你能把你的代码贴出来让我运行它看看我是否得到同样的结果吗?
  • 你什么时候打电话给CreateBitmapFromVisual?什么时候构造控件?实际的控件尺寸受主题和字体放大等因素的影响,最终尺寸只有在控件实际渲染后才能确定。您必须等到控件绘制后才能获取其屏幕尺寸。
  • CreateBitmapFromVisual 在控件绘制完成后被调用。从整个窗口给出的 ActualWidth 比我应该说的要少得多的事实来看,它与控件本身的关系较小,而与框架和系统之间的交互作用更多

标签: wpf window size width resolution


【解决方案1】:

您是否查看过显示器的 DPI 设置?

为此,请转到控制面板 - 显示并选择设置自定义文本大小 (DPI)。在打开的对话框中,您将看到比例为百分比。如果未设置为 100%,请尝试此操作。这可能是您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 2022-01-19
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多