2014-09-01 12 views
7

Hat jemand eine komplette Konvertierung von wpf Pen zu gdi + one gemacht?Convert System.Windows.Media.Pen to System.Drawing.Pen

Es klingt zunächst nicht kompliziert: Konstruktor mit entsprechendem Pinsel verwenden. Aber es gibt so viele kleine Details: verschiedene Pinsel (5 in WPF und 5 in GDI + mit verschiedenen Namen, Eigenschaften, etc) und auch Stifteigenschaften selbst.

Vielleicht gibt es viel einfache Lösung, wie ToString()/Parse() eine oder über die Serialisierung oder vielleicht eine spezielle Methode oder versteckte Klasse. Ich will nicht lang und falsch gehen if(type is ...) Weg.

Hier ist ein möglicher Ansatz (zu demonstrieren, kann nicht funktionieren)

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

Alle Pinsel in WPF können nicht in GDI + Pinsel konvertiert werden. Beispiel 'VisualBrush',' RadialGradientBrush', 'ImageBrush' usw. Was möchten Sie in diesem Fall tun? Ich spreche hier von Pinseln, weil 'Media.Pen'' Media.Brush' als Konstruktorparameter erlaubt. –

+0

@SriramSakthivel, würde ich eine Konvertierung in kompatible Typ oder Ausnahme erwarten, wenn dieser Typ nicht dargestellt werden kann. Und das ist genau mein Punkt, ich selbst kann nur für die einfachsten Fälle in der geraden Weise überprüfen, wenn (Art ist ...) 'Weise. – Sinatr

+0

http://stackoverflow.com/questions/1046301/convert-system-windows-media-brush-to-system-drawing-brush –

Antwort

1

Sie können nicht von einem WPF-Stift auf eine GDI Stift oder umgekehrt konvertieren, weil sie zwei völlig verschiedene Systeme für die Zeichnung zu Fenstern. Das Beste, was Sie tun können, ist einen neuen Stift mit Eigenschaften zu erstellen, die so nah wie möglich am Originalstift liegen.

Der Grund dafür ist, dass WPF GDI nicht verwendet, um Fensterinhalte (WPF/GDI Interop Situationen ungeachtet) zu zeichnen. Stattdessen verwendet WPF seinen eigenen Renderer, wenn ich mich bei Direct2D und Direct3D nicht irre. Daher ist ein Stift in WPF nicht die gleiche Art wie in GDI, wo er als primäres Objekt einer tatsächlichen Grafikzeichnung existiert.

Wenn Sie GDI Stifte haben müssen, die als Pendants zu bestehenden WPF Stiften dienen, Sie haben nicht wirklich viel von einer Wahl, als eine Reihe von if oder switch angetrieben Code zu schreiben neues System.Drawing einzurichten und zurück .Pen Objekte. Es gibt keinen anderen Weg.

+1

Das habe ich schon gemacht. – Sinatr

+0

Nun, es wird nicht besser werden. –