6

ダイナミックに何かを描きたいです。次のコードは私のOnRenderを示しています。プログラムの必要な場所にDrawItemを設定しています。しかし、私が電話をかけているときDrawItem =5;、OnRenderが呼び出されるように、何を呼び出す必要がありますか?

protected override void OnRender(DrawingContext drawingContext)
{
    switch (DrawItem)
    {
        case 1:
            //Draw Item 
            break;
        case 2:
            //Draw Item 
            break;
        case 3:
            //Draw Item 
            break;
        case 4:
            //Draw Item 
            break;
        case 5:
            //Draw Item 
            break;
    }
    base.OnRender(drawingContext)
}

public int DrawItem { get; set; }
4

4 に答える 4

17

コントロールのサイズが変更された場合は使用できますがInvalidateVisual()、これによりUIの再レイアウトにかなりの費用がかかることに注意してください。コントロールのサイズが同じままである場合は、を呼び出さないでくださいInvalidateVisual()

UIを更新するためのより効率的な方法は、DrawingGroup「バッキングストア」を作成し、それをDrawingContext中に追加することOnRender()です。その後、を使用していつでも更新できDrawingGroup.Open()ます。WPFはUIを更新します。

これが紛らわしいように聞こえる場合は、WPFが保持された描画システムであることを忘れないでください。つまりOnRender()、と呼ばれる方がよいということAccumulateDrawingObjects()です。実際には、ライブ描画オブジェクトのツリーが蓄積されており、そのうちのいくつか(DrawingGroup、RenderTargetBitmap、WriteableBitmapなど)は後で更新できます。

これはどのように見えるかです:

DrawingGroup backingStore = new DrawingGroup();

protected override void OnRender(DrawingContext drawingContext) {      
    base.OnRender(drawingContext);            

    Render(); // put content into our backingStore
    drawingContext.DrawDrawing(backingStore);
}

// I can call this anytime, and it'll update my visual drawing
// without ever triggering layout or OnRender()
private void Render() {            
    var drawingContext = backingStore.Open();
    Render(drawingContext);
    drawingContext.Close();            
}
于 2017-06-08T04:43:23.433 に答える
7

あなたの質問は明確ではありませんが、私が理解できることから、あなたは描画変数を更新した後にビジュアルを更新する方法を求めているようです。描画変数を更新した後、以下を使用できます。

this.InvalidateVisual();

とプロパティで:

private int drawItem;
pulic int DrawItem
{
 get {return drawItem;}
 set 
 {
    drawItem=value;
    this.InvalidateVisual();
 }
}
于 2012-05-14T14:17:39.173 に答える
4

私は同様の問題に遭遇し、さらにエレガントな解決策を見つけました。次のようにDependencyPropertyを定義します。

public static readonly DependencyProperty PropertyNameProperty = DependencyProperty.Register("PropertyName", typeof(PropertyType), typeof(PropertyElementType), new FrameworkPropertyMetadata(DefaultPropertyValue, FrameworkPropertyMetadataOptions.AffectsRender));

ここでの鍵はこれです:

FrameworkPropertyMetadataOptions.AffectsRender

これで、プロパティをXAMLで設定でき、変更時にビジュアルが自動的に更新されます。

于 2016-03-08T18:37:16.643 に答える
1

http://msdn.microsoft.com/de-de/library/ms598919(v=vs.100).aspx

更新されるコントロールに対してInvalidateVisualを呼び出す必要があります。ただし、ご覧のとおり、InvalidateVisualを呼び出すと、完全なレイアウトサイクルが発生するため、パフォーマンス上の理由から、キャンバスまたは描画するものに子要素が含まれていないか、わずかしか含まれていないことを確認してください。

于 2012-05-14T14:19:56.827 に答える