Необходимо использовать Визуальные объекты вместо Shape ; в частности, как было предложено, DrawingVisual : визуальный объект, который можно использовать для визуализации векторной графики. На самом деле, как написано в библиотеке MSDN:
DrawingVisual - это легкий класс рисования, который используется для визуализации фигур, изображений или текста. Этот класс считается легковесным, поскольку он не обеспечивает компоновку, ввод, фокусировку или обработку событий, что повышает его производительность. По этой причине рисунки идеально подходят для фонов и картинок.
Так, например, чтобы создать DrawingVisual, содержащий прямоугольник:
private DrawingVisual CreateDrawingVisualRectangle()
{
DrawingVisual drawingVisual = new DrawingVisual();
// Retrieve the DrawingContext in order to create new drawing content.
DrawingContext drawingContext = drawingVisual.RenderOpen();
// Create a rectangle and draw it in the DrawingContext.
Rect rect = new Rect(new System.Windows.Point(160, 100), new System.Windows.Size(320, 80));
drawingContext.DrawRectangle(System.Windows.Media.Brushes.LightBlue, (System.Windows.Media.Pen)null, rect);
// Persist the drawing content.
drawingContext.Close();
return drawingVisual;
}
Чтобы использовать объекты DrawingVisual, вам необходимо создать хост-контейнер для объектов. Хост-контейнерный объект должен быть производным от класса FrameworkElement, который обеспечивает поддержку макета и обработки событий, отсутствующих в классе DrawingVisual. Когда вы создаете объект контейнера хоста для визуальных объектов, вам необходимо сохранить ссылки на визуальные объекты в VisualCollection .
public class MyVisualHost : FrameworkElement
{
// Create a collection of child visual objects.
private VisualCollection _children;
public MyVisualHost()
{
_children = new VisualCollection(this);
_children.Add(CreateDrawingVisualRectangle());
// Add the event handler for MouseLeftButtonUp.
this.MouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(MyVisualHost_MouseLeftButtonUp);
}
}
Подпрограмма обработки событий может затем выполнить тестирование попаданий, вызвав метод HitTest . Параметр HitTestResultCallback метода относится к пользовательской процедуре, которую можно использовать для определения итогового действия теста на попадание.