FrameworkElement
을 직접 작성하고 VisualChildrenCount{get;}
및 GetVisualChild(int index)
을 내 DrawingVisual
인스턴스를 반환하여 덮어 씁니다.DrawingVisual이 새로 고쳐지지 않습니다.
DrawingVisual.RenderOpen()
을 사용하여 초기 렌더링 (예 : 타이머 핸들러에서) 한 후 시각적 콘텐츠를 수정하면 요소가 새로 고쳐지지 않습니다.
using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
namespace VisualTest
{
public class TestControl : FrameworkElement
{
private readonly DrawingVisual _visual = new DrawingVisual();
public TestControl()
{
Draw(false);
var timer = new DispatcherTimer {Interval = new TimeSpan(0, 0, 2)};
timer.Tick += (sender, args) =>
{
Draw(true);
InvalidateVisual();
timer.Stop();
};
timer.Start();
}
protected override Visual GetVisualChild(int index)
{
return _visual;
}
protected override int VisualChildrenCount
{
get { return 1; }
}
private void Draw(bool second)
{
DrawingContext ctx = _visual.RenderOpen();
if (!second)
ctx.DrawRoundedRectangle(Brushes.Green, null, new Rect(0, 0, 200, 200), 20, 20);
else
ctx.DrawEllipse(Brushes.Red, null, new Point(100, 100), 100, 100);
ctx.Close();
}
}
}
InvalidateVisual()
는 아무것도하지 않습니다 :
다음은 간단한 예제입니다. 요소가 포함 된 창 크기를 조정하면 업데이트됩니다.
콘텐츠를 제대로 새로 고치는 방법에 대한 아이디어가 있으십니까? 바람직하게는 이없고은 내 요소에 대한 새 종속성 속성을 도입합니다.
이 코드는 시각적으로 메모리에 누수가 발생하지만 트리에 추가 될 때 제거되지 않습니다. 더 나은 코드는 Loaded 이벤트에 시각적 요소를 추가하고 Unloaded 이벤트에서 제거하는 것입니다. 내 대답을 참조하십시오. – splintor