在自定义 InkCanvas 中绘制笔触和绘制视觉对象

本文关键字:绘制 视觉 对象 InkCanvas 自定义 | 更新日期: 2023-09-27 18:37:06

我有一个继承InkCanvas类的类。我覆盖了 VisualChildrenCount 属性和 GetVisualChild 方法:

Visual GetVisualChild(int index)
{
    if (index == 0)
    {
        return InkCanvas.GetVisualChild(index);
    }
    return visuals[index - 1].Visual;
}

int VisualChildrenCount
{
    get { return visuals.Count + InkCanvas.VisualChildrenCount; }
}

其中视觉对象是我的集合视觉对象,Visual 属性返回DrawingVisual对象。我使用此类来添加和显示DrawingVisual对象(性能原因):

void AddVisual(MyVisual visual)
{
    if (visual == null)
        throw new ArgumentNullException("visual");
    visuals.Add(visual);
    AddVisualChild(visual->Visual);
    AddLogicalChild(visual->Visual);
}

问题如下:当我绘制新Stroke(在用鼠标自由绘图中)时,此笔画被添加到 InkCancas 中,但在以前的 DrawingVisual(Z 顺序)下,因此,例如,如果我在一个大矩形下绘制笔触,我看不到任何东西,因为笔触是隐藏的。

如何解决这个偷偷摸摸的问题?

在自定义 InkCanvas 中绘制笔触和绘制视觉对象

将 InkCanvas 的 Background 属性设置为 Transparent(或 null ),并以与 GetVisualChild 替代不同的顺序返回视觉对象:

protected override Visual GetVisualChild(int index)
{
    if (index < visuals.Count)
    {
        return visuals[index].Visual;
    }
    return base.GetVisualChild(index - visuals.Count);
}