2014-09-01 17 views
7

Czy ktoś dokonał pełnej konwersji z wpf Pen na gdi + jeden?Konwertuj System.Windows.Media.Pen na System.Drawing.Pen

Początkowo nie brzmi to skomplikowanie: używaj konstruktora z odpowiednim pędzlem. Ale jest tak wiele szczegółów małych:: różne pędzle (5 w wpf i 5 w gdi + o różnych nazwach, właściwościach, itp.), A także same własności pióra.

Być może istnieje wiele prosty rozwiązanie, jak ToString()/Parse() jeden lub poprzez serializacji czy może specjalnej metody lub ukrytego klasie. Nie chcę iść długo i źle.

Oto jeden z możliwych rozwiązań (w celu wykazania, mogą nie działać)

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

Wszystkie pędzle w pliku wpf nie mogą zostać przekonwertowane na gdi + pędzel. Przykład 'VisualBrush',' RadialGradientBrush', 'ImageBrush' itd. Co chciałbyś w tym przypadku zrobić? Mówię tu o pędzlach, ponieważ 'Media.Pen' zezwala na' Media.Brush' jako parametr konstruktora. –

+0

@SriramSakthivel, Spodziewam się konwersji na kompatybilny typ lub wyjątek, jeśli tego typu nie można reprezentować. I to jest właśnie moja uwaga, ja sam mogę tylko sprawdzić najprostsze przypadki w prosty sposób 'if (type is ...)' way. – Sinatr

+0

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

Odpowiedz

1

Nie można przekonwertować z piórem WPF do pióra GDI lub odwrotnie, bo to dwa zupełnie różne systemy do rysowania do okien. Najlepsze co możesz zrobić, to stworzyć nowe pióro o właściwościach jak najbardziej zbliżonych do oryginalnego pisaka.

Powodem tego jest to, że WPF nie używa GDI do rysowania zawartości okna (niezależnie od interakcji WPF/GDI). Zamiast tego, WPF używa własnego renderera, jeśli nie pomylę się na Direct2D i Direct3D. W związku z tym pióro w WPF to nie to samo, co w GDI, gdzie istnieje jako rzeczywisty obiekt rysowania grafiki.

Jeśli trzeba mieć GDI pióra, które służą jako odpowiedników istniejących zagród WPF, tak naprawdę nie ma wielkiego wyboru, ale żeby napisać kilka if lub switch napędzany kodu, aby skonfigurować i powrócić nowego System.Drawing .Pen obiekty. Nie ma na to innego sposobu.

+1

To już zrobiłem. – Sinatr

+0

Cóż, to nie będzie nic lepszego. –