コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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();
            }
        }