7

私は .NET 3.5 で Adorner を使用しており、OnRender をオーバーライドすることで描画できますが、外観を変更するために adorner を再描画する機能が必要です。

基本的に、描画コンテキストをクリアして OnRender を再度呼び出す方法を探しています。これを行う最善の方法は何ですか、またはより良いアプローチはありますか?

public class MyAdorner : Adorner
{
    private Brush brush = Brushes.Red;

    public DragArrowAdorner(UIElement adornedElement) : base(adornedElement)
    {}

    public void RedrawWithBrush(Brush newBrush)
    {
        brush = newBrush;

        // redraw..?
    }

    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
    {
        // some drawing code...
        drawingContext.DrawRectangle(
            brush, 
            null, 
            new Rect(AdornedElement.DesiredSize));
    }
}
4

2 に答える 2

11

あなたの質問への答えはInvalidateVisual、 OnRender を再度呼び出すために使用することです

ただし、OnRender で独自の描画を行う代わりに、標準のスタイリングとビジュアル ツリー テンプレートを使用して、装飾の実際のビジュアルを構築することをお勧めします。これは、ストーリーボードを使用して標準の XAML アニメーションを内部で実行できることも意味します。

このアプローチを使用する場合は、装飾クラスで次のことを行う必要があります。

  • base.AddVisualChild()コンストラクターで、装飾に表示するビジュアルを使用して独自のビジュアル コレクションを呼び出すか作成します。
  • ArrangeOverride(Size size)子を適切に配置するためにオーバーライドします。
  • VisualChildrenCountアドナー ビジュアル ツリー内の子の数を返すようにオーバーライドします。
  • GetCisualChild(int index)特定の子を返すようにオーバーライドします。

詳細については、ResizingAdorner MSDN サンプルを参照してください。

于 2009-02-24T22:34:22.577 に答える