将System.Windows.Media.Pen转换为System.Drawing.Pen

Sin*_*atr 7 c# wpf winforms

有没有人完成从wpf转换Pen为gdi + one的转换?

起初听起来并不复杂:使用带有相应画笔的构造函数.但是有很多细节:不同的画笔(wpf中有5个,gdi中有5个不同的名称,属性等)以及笔本身.

也许有很多简单的解决方案,比如ToString()/ Parse()one或者通过序列化,或者可能是专用方法或隐藏类.不想走多远的if(type is ...)路.

这是一种可能的方法(演示,可能不起作用)

using System.Windows.Media;
using GDI = System.Drawing;

public static GDI.Pen ToGDI(this Pen pen)
{
    var brush = pen.Brush;
    var thickness = pen.Thickness;
    if(brush is SolidColorBrush)
    {
        var color = ((SolidColorBrush)brush).Color;
        return new GDI.Pen(new GDI.SolidBrush(Colors.FromArgb(color.A, color.R, color.G, color.B)), (float)thickness);
    }
    else if(brush is ...)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ruk 1

您无法从 WPF 笔转换为 GDI 笔,反之亦然,因为它们是两个完全不同的绘制到窗口的系统。您能做的最好的事情就是创建一支新笔,其属性尽可能接近原始笔。

其原因是 WPF 不使用 GDI 来绘制窗口内容(尽管存在 WPF/GDI 互操作情况)。相反,WPF 使用自己的渲染器,如果我没记错的话,它是基于 Direct2D 和 Direct3D 的。因此,WPF 中的画笔与 GDI 中的画笔不同,GDI 中的画笔作为实际的图形绘制基元对象而存在。

如果您需要使用 GDI 笔来充当现有 WPF 笔的对应项,那么您实际上没有太多选择,只能编写一堆代码ifswitch驱动代码来设置和返回新的 System.Drawing.Pen 对象。没有其他办法可以解决这个问题。