2

クラスを継承する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 オーダー) の下に追加されるため、たとえば、大きな四角形の下にストロークを描画するとします。ストロークが隠れているので何も見えません。

この卑劣な問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

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);
}
于 2013-10-26T13:36:50.693 に答える