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

C# 将System.Windows.Media.Pen转换为System.Drawing.Pen,c#,wpf,winforms,C#,Wpf,Winforms,是否有人将wpfPen完全转换为gdi+one 一开始听起来并不复杂:使用带有相应画笔的构造函数。但是有很多小细节:不同的画笔(wpf中有5个,gdi+中有5个,名称、属性等不同),还有画笔本身的属性 也许有很多简单的解决方案,比如ToString()/Parse()一个或通过序列化,或者通过专用方法或隐藏类。如果(类型为…)不想走长距离和错误的way 以下是一种可能的方法(为了证明,可能不起作用) 您不能从WPF笔转换为GDI笔,或者从GDI笔转换为WPF笔,因为它们是两个完全不同的用于向wi

是否有人将wpf
Pen
完全转换为gdi+one

一开始听起来并不复杂:使用带有相应画笔的构造函数。但是有很多小细节:不同的画笔(wpf中有5个,gdi+中有5个,名称、属性等不同),还有画笔本身的属性

也许有很多简单的解决方案,比如
ToString()
/
Parse()
一个或通过序列化,或者通过专用方法或隐藏类。如果(类型为…)不想走长距离和错误的
way

以下是一种可能的方法(为了证明,可能不起作用)


您不能从WPF笔转换为GDI笔,或者从GDI笔转换为WPF笔,因为它们是两个完全不同的用于向windows绘图的系统。您所能做的最好是创建一支属性尽可能接近原始笔的新笔

原因是WPF不使用GDI来绘制窗口内容(尽管存在WPF/GDI互操作情况)。相反,WPF使用自己的渲染器,前提是我没有弄错Direct2D和Direct3D。因此,WPF中的笔与GDI中的笔不同,在GDI中,笔作为实际的图形绘制原语对象存在


如果您需要GDI笔作为现有WPF笔的对应项,那么除了编写一堆
If
switch
驱动代码来设置和返回新的System.Drawing.Pen对象之外,您实际上没有太多选择。没有别的办法了。

wpf中的所有画笔都无法转换为gdi+画笔。示例
VisualBrush
RadialGradientBrush
ImageBrush
等。在这种情况下,您希望执行什么操作?我在这里谈论画笔是因为
Media.Pen
允许
Media.Brush
作为构造函数参数。@SriramSakthivel,如果无法表示此类型,我希望转换为兼容类型或异常。这正是我的观点,我自己只能直接用
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 ...)
    {
        ...
    }
}