WPF - Добавление ContentControl в пользовательский холст - PullRequest
1 голос
/ 09 января 2011

У меня есть собственный DrawingCanvas, который унаследован от Canvas. Когда я добавляю ContentControl в DrawingCanvas со следующим кодом, ничего не появляется.

GraphicsRectangle rect = new GraphicsRectangle(0, 0, 200, 200, 5, Colors.Blue);
DrawingContainer host = new DrawingContainer(rect);

ContentControl control = new ContentControl();
control.Width = 200;
control.Height = 200;
DrawingCanvas.SetLeft(control, 100);
DrawingCanvas.SetTop(control, 100);
control.Style = Application.Current.Resources["DesignerItemStyle"] as Style;

control.Content = host;

drawingCanvas.Children.Add(control);

GraphicsRectangle - это DrawingVisual, а конструктор выше рисует объект Rect с (0,0) верхней левой точкой и длиной 200 к DrawingContext of GraphicsRectangle. DrawingContainer - это FrameworkElement, и у него есть один дочерний элемент, который указан выше, с конструктором. DrawingContainer реализует методы переопределения GetVisualChild и VisualChildrenCount. Наконец, свойство Content для ContentControl установлено на DrawingContainer, чтобы иметь возможность отображать содержимое DrawingVisual.

Когда я добавляю созданный ContentControl в обычный Canvas, элемент управления отображается правильно. Я предполагаю, что причина в том, что DrawingCanvas не реализует метод ArrangeOverride. Он реализует только метод MeasureOverride. Также DrawingContainer не реализует меры и Организовать методы переопределения. Есть идеи?

1 Ответ

1 голос
/ 09 января 2011

Как я и думал, проблема в том, что в DrawingCanvas отсутствует метод ArrangeOverride. Со следующим методом ArrangeOverride, добавленным в DrawingCanvas, ContentControls отображаются правильно.

protected override Size ArrangeOverride(Size arrangeSize)
{
    foreach (Visual child1 in children)
    {
        if (child1 is DrawingVisual)
            continue;

        ContentControl child = child1 as ContentControl;
        GraphicsBase content = ((DrawingContainer)(child.Content)).GraphicsObject;

        child.Arrange(new Rect(DrawingCanvas.GetLeft(child), DrawingCanvas.GetTop(child), content.Width, content.Height));
     }

     return arrangeSize;
}

где GraphicsBase является базой класса GraphicsRectangle. Чтобы определить размер GraphicsBase, я добавил в GraphicsBase свойства ширины и высоты, которые задаются в конструкторе GraphicsRectangle.

...