Помещение визуальных объектов в оболочку элемента

 
0
 
.NET
ava
Garcian | 12.11.2012, 20: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. Помогите!
Comments (1)
ava
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. Квадраты не рисуются, ПОЧЕМУ?
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Garcian
advanced
Submit