private void DrawingSurface_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var position = e.GetPosition(DrawingSurface); if (AddRadioButton.IsChecked == true) { // Создать, нарисовать и добавить новый квадрат var visual = new DrawingVisual(); DrawSquare(visual, position, false); DrawingSurface.AddVisual(visual); } else if (DeleteRadioButton.IsChecked == true) { var visual = DrawingSurface.GetVisual(position); if (visual != null) { DrawingSurface.DeleteVisual(visual); } } else if (SelectMoveRadioButton.IsChecked == true) { var visual = DrawingSurface.GetVisual(position); if (visual != null) { /* Найти верхний левый угол квадрата. Это делается просмотром текущих границ * и удаления половины границы (толщины пера). Альтернативное решение может * предусматривать хранение верхней левой точки каждого визуального элемента * в коллекции DrawingCanvas и предоставление этой точки при проверке попадания. */ var topLeftCorner = new Point( visual.ContentBounds.TopLeft.X + _drawingPen.Thickness / 2, visual.ContentBounds.TopLeft.Y + _drawingPen.Thickness / 2); DrawSquare(visual, topLeftCorner, true); _clickOffset = topLeftCorner - position; _isDragging = true; if (_selectedVisual != null && !Equals(_selectedVisual, visual)) { // Выбор изменился. Очистить предыдущий выбор. ClearSelection(); } _selectedVisual = visual; } } else if (SelectMultipleRadioButton.IsChecked == true) { _selectionSquare = new DrawingVisual(); DrawingSurface.AddVisual(_selectionSquare); _selectionSquareTopLeft = position; _isMultiSelecting = true; // Обеспечить получение события MouseLeftButtonUp, даже // если пользователь вышел за пределы Canvas. В противном // случае могут быть нарисованы два квадрата сразу. DrawingSurface.CaptureMouse(); } }
private void DrawingSurface_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { _isDragging = false; if (_isMultiSelecting) { // Отобразить все квадраты в этой области. var geometry = new RectangleGeometry( new Rect(_selectionSquareTopLeft, e.GetPosition(DrawingSurface))); var visualsInRegion = DrawingSurface.GetVisuals(geometry); MessageBox.Show(string.Format("You selected {0} square(s).", visualsInRegion.Count)); _isMultiSelecting = false; DrawingSurface.DeleteVisual(_selectionSquare); DrawingSurface.ReleaseMouseCapture(); } }