有没有人完成从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)
您无法从 WPF 笔转换为 GDI 笔,反之亦然,因为它们是两个完全不同的绘制到窗口的系统。您能做的最好的事情就是创建一支新笔,其属性尽可能接近原始笔。
其原因是 WPF 不使用 GDI 来绘制窗口内容(尽管存在 WPF/GDI 互操作情况)。相反,WPF 使用自己的渲染器,如果我没记错的话,它是基于 Direct2D 和 Direct3D 的。因此,WPF 中的画笔与 GDI 中的画笔不同,GDI 中的画笔作为实际的图形绘制基元对象而存在。
如果您需要使用 GDI 笔来充当现有 WPF 笔的对应项,那么您实际上没有太多选择,只能编写一堆代码if
或switch
驱动代码来设置和返回新的 System.Drawing.Pen 对象。没有其他办法可以解决这个问题。