Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Помещение визуальных объектов в оболочку элемента


Автор: Garcian 12.11.2012, 19:24
Здраствуйте. Пример из книги Мак-Дональда. Добавление визуальных элементов в оболочку элемента. 
Не понимаю как реализовать задачу - простое добавление кружков по щелчку мыши. После создания эти кружки должны быть доступны для обработки.
В книге так: создается класс наследуемый от Canvas (он хранит коллекцию визуальных элементов)
Код

public class DrawingCanvas : Canvas
        {
            private List<Visual> visuals = new List<Visual>();
            protected override int VisualChildrenCount
            {
                get
                {
                    return base.VisualChildrenCount;
                }
            }
            protected override Visual GetVisualChild(int index)
            {
                return visuals[index];
            }

            public void AddVisual(Visual visual)
            {
                visuals.Add(visual);
                base.AddVisualChild(visual);
                base.AddLogicalChild(visual);
            }

            public void DeleteVisual(Visual visual)
            {
                visuals.Remove(visual);
                base.RemoveVisualChild(visual);
                base.RemoveLogicalChild(visual);
            }
        }

Далее сказано: DrawingCanvas объявляется в XAML разметке окна
Код

 <local:DrawingCanvas x:Name="drawingSurface" Background="White" 
                    ClipToBounds="True" 
                    MouseLeftButtonDown="drawingSurface_MouseLeftButtonDown" 
                    MouseLeftButtonUp="drawingSurface_MouseLeftButtonUp" 
                    MouseMove="drawingSurface_MouseMove" />


Для начала, куда это добавлять? Никак не пойму, ничего не получается!  smile 

В частности, пробовал просто присвоить имя для Canvas и создать событие, и обработать его. Но тогда мне не доступны методы drawingSurface. Помогите!

Автор: Garcian 12.11.2012, 20:13
Сделал так:
Код

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <local:DrawingCanvas x:Name="drawingSurface" Background="White" ClipToBounds="True" MouseLeftButtonDown="drawingSurface_MouseLeftButtonDown" MouseDown="drawingSurface_MouseDown"></local:DrawingCanvas>
</Window>


Добавил рисование квадратов
Код

        private Brush drawingBrush = Brushes.AliceBlue;
        private Brush selectedDrawingBrush = Brushes.LightGoldenrodYellow;
        private Pen drawingPen = new Pen(Brushes.SteelBlue, 3);
        private Size squareSize = new Size(30, 30); 

// не отлавливает

        private void drawingSurface_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Point pCl = e.GetPosition(drawingSurface);
            // Создание, рисование и добавление нового квадрата. 
            DrawingVisual visual = new DrawingVisual();
            DrawSquare(visual, pCl);
            drawingSurface.AddVisual(visual);
        }

        private void DrawSquare(DrawingVisual visual, Point topLeftCorner)
        {
            using (DrawingContext dc = visual.RenderOpen())
            {
                Brush brush = drawingBrush;
                dc.DrawRectangle(brush, drawingPen,
                new Rect(topLeftCorner, squareSize));
            } 

        }

        private void drawingSurface_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Point pCl = e.GetPosition(drawingSurface);
            // Создание, рисование и добавление нового квадрата. 
            DrawingVisual visual = new DrawingVisual();
            DrawSquare(visual, pCl);
            drawingSurface.AddVisual(visual);
        }


Нажатие левой кнопки мыши не отлавливает, поэтому добавил просто mouseDown. Квадраты не рисуются, ПОЧЕМУ? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)