如何修复VisualBrush丢失的行?

时间:2017-06-12 08:55:45

标签: wpf wpf-controls

在WPF中,我们可以使用VisualBrush做一些像ppt左侧的事情。

但是当我将VisualBrush缩放到一个小尺寸时,我发现VisualBrush可能会丢失Rectangle中的一行。就像图像一样:

enter image description here

你可以看到VisualBrush丢失了底线。

但我想要的是如下图所示:enter image description here

当我尝试使用使用RenderTargetBitmap获取图像的BitmapImage并使用线性插值算法进行缩放时,将获得清晰图像。

我可以更改VisualBrush的算法吗?我认为它可能会使用邻域像素算法。

是否有任何具有良好性能的打印屏幕算法,如VisualBrush。

当我将搜索关键字更改为ViewBox时,我可以找到与此问题相同的问题:how to avoid a single pixel line disappear in wpf?

1 个答案:

答案 0 :(得分:1)

有一个名为TransformedBitmap的类可以使用默认缩放算法缩放RenderTargetBitmap

使用以下代码:

public static BitmapSource ToBitmapSource(this Visual visual, Size size)
{
    var bounds = VisualTreeHelper.GetDescendantBounds(visual);
    var width = (int) Math.Round(bounds.Width);
    var height = (int) Math.Round(bounds.Height);
    var bitmap = new RenderTargetBitmap(width, height, 96.0, 96.0, PixelFormats.Pbgra32);
    bitmap.Render(visual);
    return new TransformedBitmap(bitmap, new ScaleTransform(size.Width / width, size.Height / height));
}

我在我的演示中尝试了这种方法并得到了下面的结果。您可能会注意到左上角的小矩形没有丢失。

enter image description here