Intereting Posts
Тип «T» должен быть невообразимым типом значения, чтобы использовать его как параметр «T» в родовом типе или методе «System.Nullable » ManualResetEventSlim: Вызов .Set (), за которым следует сразу .Reset () не выпускает * любые * ожидающие streamи Общий статический class – выбор типа объекта во время выполнения Уведомление об изменении с зависимостью Oracle в C # Делегаты и Лямбдас и LINQ, Oh My! C #: Наследовать от булевых? не удалось подключиться к любому из указанных узлов mysql. C # Использование singleton HttpClient с Microsoft.Rest.ServiceClient – получение System.MissingMethodException отображение паролей на каком-либо событии для пароля Как правильно использовать KeyPressEvent Как я могу удалить символы алфавита из строки ? Сертификат клиента Mono HttpListener Значения параметров настройки в вызове Moq Callback () C # Propertygrid значение по умолчанию typeconverter Моя 32-битная головная боль – это 64-битная мигрень?!? (или 64-битные ошибки CLR Runtime)

Как отобразить метафайл в Windows?

Мне нужно отобразить метафайл (EMF) Windows с помощью WPF, как я могу это сделать?

Редактировать:

Я бы сохранил изображение на основе вектора.

    Взгляните на стороннюю библиотеку Ab2d.ReadWmf .

    Обновление # 1: Обзор

    Во-первых, в этом сообщении говорится, что Microsoft не намерена поддерживать файлы EMF в WPF. Это не значит, что это невозможно, просто они не будут их поддерживать.

    Глядя на страницу Википедии о формате WMF / EMF, я вижу, что она описывает EMF как:

    По существу, файл WMF хранит список вызовов функций, которые должны быть выведены на уровень интерфейса графического интерфейса Windows (GDI) для отображения изображения на экране. Поскольку некоторые функции GDI принимают указатели на функции обратного вызова для обработки ошибок, файл WMF может ошибочно включать исполняемый код.

    Если вы много работали с WPF, вы знаете, что WPF принципиально отличается от GDI. Краткий обзор доступен здесь . Это означает, что вам нужно будет прочитать в своем EMF-файле и перевести вызовы GDI на вызовы WPF. Вот нить, где они обсуждают этот процесс. Мне это очень нравится.

    К счастью, Microsoft предоставляет интерфейс для чтения в метафайлах Windows. Взгляните на этот stream для примера и документации, доступной здесь , но это поможет вам только на полпути, так как это не WPF Visual. На данный момент я считаю, что самым простым решением было бы создать элемент управления WinForms в вашем приложении WPF и разместить его внутри элемента управления WindowsFormsHost.

    Обновление №2: Пример кода

    Чтобы отобразить EMF-файл в приложении WPF:

    1. Создание пользовательского элемента управления WinForms
    2. Загрузите файл EMF в объект MetaFile и нарисуйте его в обработчике OnPaint.
    3. Добавить ссылку на библиотеку WindowsFormsIntegration
    4. Расположите свой элемент управления WinForms внутри элемента WindowsFormsHost

    UserControl:

    public partial class UserControl1 : UserControl { private Metafile metafile1; public UserControl1() { InitializeComponent(); metafile1 = new Metafile(@"C:\logo2.emf"); } protected override void OnPaint(PaintEventArgs e) { e.Graphics.DrawImage(metafile1, 0, 0); } } 

    XAML:

            

    Вот утилита, которая загружает EMF-файл и преобразует его в WPF BitmapSource :

     public static class Emfutilities { public static BitmapSource ToBitmapSource(string path) { using (System.Drawing.Imaging.Metafile emf = new System.Drawing.Imaging.Metafile(path)) using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(emf.Width, emf.Height)) { bmp.SetResolution(emf.HorizontalResolution, emf.VerticalResolution); using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp)) { g.DrawImage(emf, 0, 0); return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); } } } } 

    Вы просто используете его так:

     namespace WpfApplication1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // img is of Image type for example img.Source = Emfutilities.ToBitmapSource("SampleMetafile.emf"); } } } 

    Недостатком является то, что вам нужно будет ссылаться на System.Drawing.dll (GDI +) в ваше приложение WPF, но это не должно быть большой проблемой.