WPF - добавление ContentControl на Custom Canvas
-
08-10-2019 - |
Вопрос
У меня есть пользовательский DrawingCanvas, который унаследован от холста. Когда я добавляю 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);
GraphicsrectangleAngle - это рисунок, а конструктор выше натягивает прямоугольников с (0,0) верхней левой точки и длиной 200 до чертежа графического элемента графического элемента. DrawingContainer - это каменное управление, и у него есть один ребенок, который прямо выше, дан с конструктором. DrawingContainer реализует методы переопределения GetVisualChild и VisualChildrencount. Наконец, свойство контента ContentControl устанавливается на DrawingContainer, чтобы иметь возможность показать контентризма.
Когда я добавляю созданный ContentControl на регулярный холст, элемент управления отображается правильно. Я предполагаю, что причина в том, что DrawingCanvas не реализует метод ArraceVerride. Это только реализует метод измерений. Также DrawingContainer не реализует измерение и устранять методы переопределения. Есть идеи?
Решение
Как я думал, проблема отсутствует методом ArraceVerride в DrawingCanvas. С помощью следующего метода Arrgeoverride добавляется в 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;
}
где графическая база является основой класса Graphicrectangle. Чтобы найти размер графической базы, я добавил свойства ширины и высоты для графической базы, которые устанавливаются в конструкторе Graphicsrectangle.