2013-05-31 3 views
4

Я хотел бы реализовать множественный выбор фигур с помощью прямоугольника перетаскивания. У меня много форм на холсте: enter image description hereWPF mutliselection of forms с использованием прямоугольника перетаскивания

Формы токов связаны с соответствующими моделями (MVVM). Мой выбор прямоугольник выглядит следующим образом: enter image description here

Когда я закончил рисовать прямоугольник выделения (мыши вверх событие), я запускаю этот код:

var itemToSelect = ViewModel.ItemsInCanvas.Where((item) => 
{ 
    // TODO : test each types of shapes to know if the selection rectangle intersects with it 
}).ToList(); 

У меня есть дифферент виды объектной модели для форм:

  • Четырехугольник: я могу получить (в коде) координаты каждого из четырех пунктов.
  • Треугольник: я могу получить (в коде) координаты каждого из трех точек.
  • Кривая: я могу получить данные о пути (как строку).
  • Ligne: Я могу получить две точки (синусоидальный то же самое объект)
  • Круг: я могу получить высоту и ширину.

Я также могу получить верхнюю и левую части каждой формы.

определить все эти формы хранятся в списке в моей основной модели представления: ItemsInCanvas

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

Моя первая попытка была (только для элемента кривой):

var itemToSelect = ViewModel.ItemsInCanvas.Where((item) => 
{ 
    if (item is CurveItem) 
    { 
     // I got my Curve Item 
     CurveItem curveItem = (item as CurveItem); 
     // I got the selection rectangle 
     RectangleGeometry SelectionRectangleGeometry = new RectangleGeometry(SelectionRectangle); 
     // Is the rectangle intersecting the shape ? 
     if (SelectionRectangleGeometry.FillContainsWithDetail(Geometry.Parse(curveItem.Data)) == IntersectionDetail.Intersects) 
      return true; 
    } 
}).ToList(); 

Но он не работает, тест возвращает Аллуэй то же самое: пересекающей.

Я думаю, что тест не заботится о положении каждой фигуры (например, если он был абсолютным, а не относительным).

Знаете ли вы, как я могу выполнить свои тесты?

ответ

2

Возможно, вы решите эту проблему, выполнив geometry hit test в визуальном слое. Передайте свой холст и геометрию выбора методу, показанному ниже, который возвращает список всех фигур, которые попадают в геометрию.

private IList<Shape> GetSelectedShapes(UIElement element, Geometry geometry) 
{ 
    var shapes = new List<Shape>(); 

    VisualTreeHelper.HitTest(element, null, 
     result => 
     { 
      var shape = result.VisualHit as Shape; 

      if (shape != null) 
      { 
       shapes.Add(shape); 
      } 

      return HitTestResultBehavior.Continue; 
     }, 
     new GeometryHitTestParameters(geometry)); 

    return shapes; 
} 

Вы можете начинать читать о Hit Testing in the Visual Layer.

+0

Спасибо, что это работает, но теперь я должен найти объект модели, связанный с формой. – Ben

+0

Вы можете поместить объект модели в свойство [Тег] (http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.tag.aspx) каждого Shape. – Clemens

+0

Как это сделать, когда я использую Rectangle для рисования выделенной области? Я не могу понять, как рисовать геометрию на холсте. –

 Смежные вопросы

  • Нет связанных вопросов^_^