2012-05-14 3 views
3

무언가를 동적으로 그려보고 싶습니다. 다음 코드는 내 OnRender를 보여줍니다. 나는 DrawItem을 내가 필요한 곳에 프로그램 내 어딘가에 설정하고있다. 하지만 전화 할 때 DrawItem =5;을 부르면 OnRender가 호출됩니다.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; } 
+2

다시 그립니다? – Will

+0

@ "새로운"무승부 아이템 – David

답변

5

당신의 질문은 명확하지 않지만 그림 변수를 업데이트 한 후에 비주얼을 새로 고치는 방법을 묻고있는 것처럼 보입니다. 당신은 당신의 그림 변수를 업데이트 한 후 다음을 사용할 수

this.InvalidateVisual(); 

와 속성 :

private int drawItem; 
pulic int DrawItem 
{ 
get {return drawItem;} 
set 
{ 
    drawItem=value; 
    this.InvalidateVisual(); 
} 
} 
+0

어디에서 전화해도 될까요? – David

+0

OnDraw가 구현 된 구성 요소 내부입니다. 다른 구성 요소를 다시 그리려면 <구성 요소 객체>가됩니다 .InvalidateVisual() – Indy9000

+0

컨트롤이 크기가 변경되고 레이아웃 변경이 필요한 경우에만 InvalidateVisual()을 사용하면 상당히 비싼 재 레이아웃을 트리거합니다. 컨트롤의 크기가 같으면 DrawingGroup에 대한 내 대답을 참조하십시오. –

1

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

당신은 갱신되어야한다 제어를위한 InvalidateVisual를 호출해야합니다. 그러나 읽을 수 있듯이 InvalidateVisual을 호출하면 전체 레이아웃주기가 발생하므로 캔버스 또는 그리려는 항목에 하위 요소가 없거나 일부만 포함 된 성능상의 이유로 인해야합니다.

0

비슷한 문제가 발생하여 더욱 세련된 해결책을 찾았습니다. 그래서 같이하는 DependencyProperty를 정의

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

여기서 핵심은 이것이다 :

FrameworkPropertyMetadataOptions.AffectsRender 

그래서 이제 속성은 XAML에서 설정 및 변경에 자동으로 시각적으로 업데이트 할 수 있습니다.

5

컨트롤의 크기가 변경된 경우 InvalidateVisual()을 사용할 수 있지만 상당히 비싼 UI 레이아웃이 다시 발생합니다. 컨트롤의 크기가 동일하게 유지되는 경우 InvalidateVisual()으로 전화하지 않아야합니다.

UI를 업데이트하는 더 효율적인 방법은 DrawingGroup "후원 스토어"를 만들고 OnRender() 동안 DrawingContext에 추가하는 것입니다. 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();    
} 
관련 문제