Creo il mio FrameworkElement
e sostituisco VisualChildrenCount{get;}
e GetVisualChild(int index)
restituendo la mia istanza DrawingVisual
.DrawingVisual non viene aggiornato
Se modifico il contenuto della vista dopo il rendering iniziale (ad esempio nel gestore di timer) utilizzando DrawingVisual.RenderOpen()
e disegno nel contesto, l'elemento non viene aggiornato.
Ecco l'esempio più semplice:
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()
non fa nulla. Anche se ridimensiona la finestra che contiene l'elemento, viene aggiornato.
Qualche idea su come aggiornare correttamente il contenuto? Preferibilmente senza che introduce nuove proprietà di dipendenza per il mio elemento.
Questo codice causerà la perdita di memoria visiva, poiché viene aggiunta all'albero, ma non viene mai rimossa. Un codice migliore è quello di aggiungere l'elemento visivo sull'evento Loaded e rimuoverlo sull'evento Unloaded - vedi la mia risposta. – splintor