Я хочу использовать рисунок GDI+ в своем элементе управления WPF.
Как использовать рисунок GDI+ в WPF?
Ответы (5)
Есть несколько способов сделать это, самый простой — заблокировать растровое изображение, которым вы манипулировали с помощью GDI, получить пиксельный буфер (Scan0 IntPtr в BitmapData, который вы получаете от блокировки). CopyMemory(...) из пиксельного буфера в WriteableBitmap.BackBuffer.
В WPF есть более эффективные способы, например использование InteropBitmap вместо WriteableBitmap. Но для этого нужно больше p/invoke.
Попробуйте скомпоновать пользовательский элемент управления Windows Form в своем проекте WPF и инкапсулировать в него рисунок GDI+. См. Пошаговое руководство. Размещение пользовательского элемента управления Windows Forms с помощью конструктора WPF
WPF поставляется с новыми графическими функциями, вы можете ознакомиться с ними здесь, но если вы хотите использовать старый GDI+ API, один из способов сделать это — создать там отрисовку Winform и разместить ее в WPF.
Решение @Jeremiah Morrill - это то, что вы сделали бы в основе. Тем не менее, Microsoft была достаточно любезна, чтобы предоставить некоторые методы взаимодействия:
using System.Windows.Interop;
using Gdi = System.Drawing;
using (var tempBitmap = new Gdi.Bitmap(width, height))
{
using (var g = Gdi.Graphics.FromImage(tempBitmap))
{
// Your GDI drawing here.
}
// Copy GDI bitmap to WPF bitmap.
var hbmp = tempBitmap.GetHbitmap();
var options = BitmapSizeOptions.FromEmptyOptions();
this.WpfTarget.Source = Imaging.CreateBitmapSourceFromHBitmap(hbmp,
IntPtr.Zero, Int32Rect.Empty, options);
}
// Redraw the WPF Image control.
this.WpfTarget.InvalidateMeasure();
this.WpfTarget.InvalidateVisual();
Gdi
? Похоже, вы изменили псевдоним System.Drawing
на Gdi (i.e. using Gdi = System.Drawing)
. Вы можете это подтвердить?
- person RB.; 11.11.2014
Это вообще плохая идея. WPF — это совершенно новый API, и смешивание с GDI+ может привести к снижению производительности, утечкам памяти и другим нежелательным явлениям.