Ich muss eine Windows Metafile (EMF) mit WPF anzeigen, wie kann ich das tun? p>
Ich würde das Bild vektorbasiert behalten.
Sehen Sie sich die Drittanbieter-Bibliothek Ab2d.ReadWmf an.
Update # 1: Übersicht
Zunächst dieser Beitrag Microsoft gibt an, dass EMF-Dateien in WPF nicht unterstützt werden sollen. Das bedeutet nicht, dass es nicht getan werden kann, nur dass sie sie nicht unterstützen werden.
Wenn man sich die Wikipedia-Seite über das WMF / EMF-Format anschaut, sehe ich EMF als:
Im Wesentlichen speichert eine WMF-Datei eine Liste von Funktionsaufrufen, die an die Windows-GDI-Ebene (Graphics Device Interface) ausgegeben werden müssen, um ein Bild auf dem Bildschirm anzuzeigen. Da einige GDI-Funktionen Zeiger auf Rückruffunktionen zur Fehlerbehandlung akzeptieren, kann eine WMF-Datei fälschlicherweise ausführbaren Code enthalten.
Wenn Sie viel mit WPF gearbeitet haben, wissen Sie, dass WPF sich grundlegend von GDI unterscheidet. Ein kurzer Überblick ist verfügbar hier . Dies bedeutet, dass Sie Ihre EMF-Datei einlesen und die GDI-Aufrufe in WPF-Aufrufe übersetzen müssen. Hier ist ein Thread , in dem sie den Prozess besprechen. Das klingt für mich nach viel Arbeit.
Zum Glück bietet Microsoft eine Schnittstelle zum Lesen von Windows Metafiles. Werfen Sie einen Blick auf diesen Thread für ein Beispiel und Die Dokumentation ist hier verfügbar , aber das wird Sie nur auf halbem Weg dorthin bringen, weil es so ist kein WPF Visual. An dieser Stelle denke ich, dass die einfachste Lösung darin besteht, ein WinForms-Steuerelement in Ihrer WPF-Anwendung zu erstellen und es in einem WindowsFormsHost-Steuerelement zu hosten.
Update # 2: Codebeispiel
So zeigen Sie eine EMF-Datei in einer WPF-Anwendung an:
Benutzerkontrolle:
%Vor%XAML:
%Vor%Hier ist eine Dienstprogrammfunktion, die eine EMF-Datei lädt und in eine WPF BitmapSource :
%Vor%Sie benutzen es einfach so:
%Vor%Der Nachteil ist, dass Sie System.Drawing.dll (GDI +) in Ihre WPF-Anwendung verweisen müssen, aber das sollte kein großes Problem sein.