WPF - 将 ContentControl 添加到自定义画布

Posted

技术标签:

【中文标题】WPF - 将 ContentControl 添加到自定义画布【英文标题】:WPF - Adding ContentControl to Custom Canvas 【发布时间】:2011-01-09 01:41:03 【问题描述】:

我有一个从 Canvas 继承的自定义 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);

GraphicsRectangle 是一个 DrawingVisual,上面的构造函数将左上角 (0,0) 点和长度为 200 的 Rect 绘制到 GraphicsRectangle 的drawingContext。 DrawingContainer 是一个 FrameworkElement,它有一个子元素,它是上面的矩形,带有构造函数。 DrawingContainer 实现 GetVisualChild 和 VisualChildrenCount 覆盖方法。最后,将 ContentControl 的 Content 属性设置为 DrawingContainer,以便能够显示 DrawingVisual 的内容。

当我将创建的 ContentControl 添加到常规 Canvas 时,控件会正确显示。我猜原因是 DrawingCanvas 没有实现 ArrangeOverride 方法。它只实现 MeasureOverride 方法。 DrawingContainer 也没有实现 Measure 和 安排覆盖方法。有任何想法吗?

【问题讨论】:

这是我一直在寻找的东西,但 DrawingContainer、GraphicsBase 和 GraphicsObject 是什么。在 visualstudio (NET.4) 中,它们都不为人所知。是不是一些自定义类。 是的。我创建了 DrawingContainer,并从 codeproject.com/KB/WPF/WPF_DrawTools.aspx 获取了 GraphicsBase、GraphicsObject 【参考方案1】:

我认为问题在于 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 中添加了 width 和 height 属性,这些属性是在 GraphicsRectangle 的构造函数中设置的。

【讨论】:

以上是关于WPF - 将 ContentControl 添加到自定义画布的主要内容,如果未能解决你的问题,请参考以下文章

使用 ContentControl 在 WPF 中显示视图不起作用

[WPF自定义控件]从ContentControl开始入门自定义控件

带有 DataTemplate 的 ContentControl 不显示任何内容(WPF MVVM)

c#WPF删除contentcontrol

WPF MVVM 为啥使用 ContentControl + DataTemplate 视图而不是直接的 XAML 窗口视图?

TabControl 内的 WPF ContentControl 不显示 DataTemplates