You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF UIElement的OnRender方法中应用模糊效果?

问题分析与解决方案

为什么你的模糊效果不生效?

你代码里的核心问题是:DrawingVisual的Effect属性属于Visual层级的渲染特性,而drawingVisual.Drawing只是提取了它内部的绘制指令集合,并不包含Effect的渲染信息。当你调用drawingContext.DrawDrawing(drawingVisual.Drawing)时,只是把原始几何图形的绘制指令直接输出,Effect并没有被应用到最终的绘制结果里。

实现需求的两种最佳方式

方式一:通过RenderTargetBitmap将带Effect的Visual渲染为位图后绘制

这种方式适合在OnRender方法内完成所有绘制逻辑的场景,核心是先把带模糊效果的DrawingVisual渲染成位图,再将位图绘制到DrawingContext中:

protected override void OnRender(DrawingContext drawingContext)
{
    DrawingVisual drawingVisual = new DrawingVisual();

    using (var dc = drawingVisual.RenderOpen())
    {
        dc.DrawGeometry(null, _borderColorPen, _textGeometry);
    }

    // 为Visual应用模糊效果
    drawingVisual.Effect = new BlurEffect { Radius = 5 };

    // 创建RenderTargetBitmap并渲染Visual
    var bounds = drawingVisual.ContentBounds;
    RenderTargetBitmap rtb = new RenderTargetBitmap(
        (int)Math.Ceiling(bounds.Width),
        (int)Math.Ceiling(bounds.Height),
        96, 96, PixelFormats.Pbgra32);
    rtb.Render(drawingVisual);

    // 绘制模糊后的位图
    drawingContext.DrawImage(rtb, bounds);

    // 绘制无模糊的原始几何图形
    drawingContext.DrawGeometry(_foreColorBrush, null, _textGeometry);
}

方式二:利用WPF视觉树添加子Visual元素(更推荐)

WPF的视觉树会自动处理Visual的Effect渲染,不需要手动处理位图,性能和可维护性更好。你可以将带模糊效果的图形作为子Visual添加到自定义控件中:

public class CustomBlurredTextElement : UIElement
{
    private readonly DrawingVisual _blurVisual;
    private Pen _borderColorPen;
    private Geometry _textGeometry;
    private Brush _foreColorBrush;

    public CustomBlurredTextElement()
    {
        _blurVisual = new DrawingVisual();
        AddVisualChild(_blurVisual);
        // 初始化_borderColorPen、_textGeometry、_foreColorBrush等资源
    }

    // 重写视觉树相关属性,让WPF识别子Visual
    protected override int VisualChildrenCount => 1;
    protected override Visual GetVisualChild(int index) 
    {
        if (index != 0)
            throw new ArgumentOutOfRangeException(nameof(index));
        return _blurVisual;
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        // 更新子Visual的绘制内容
        using (var dc = _blurVisual.RenderOpen())
        {
            dc.DrawGeometry(null, _borderColorPen, _textGeometry);
        }

        // 为子Visual应用模糊效果
        _blurVisual.Effect = new BlurEffect { Radius = 5 };

        // 绘制无模糊的原始几何图形
        drawingContext.DrawGeometry(_foreColorBrush, null, _textGeometry);
    }
}

这种方式的优势在于:WPF会自动处理Visual的布局、渲染和Effect应用,当几何图形或Effect参数变化时,只需更新Visual内容即可,不需要手动管理位图资源。


内容的提问来源于stack exchange,提问作者hseki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 12:42:28