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

时间:2014-09-01 10:02:58

标签: c# wpf winforms

是否有人完成了从wpf Pen到gdi + one的转换?

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

也许有很多简单的解决方案,例如ToString() / Parse()一个或通过序列化或者可能是专用方法或隐藏类。不想走多长的错误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 ...)
    {
        ...
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

如果您需要使用GDI笔作为现有WPF笔的对应笔,那么您实际上没有多少选择,只能编写一堆ifswitch驱动代码设置并返回新的System.Drawing.Pen对象。没有别的办法了。

相关问题