2012-08-10 3 views
6

Wir haben eine WPF-Seite mit einem Benutzersteuerelement, wo wir ein BitmapCache verwenden - wenn wir versuchen, dieses Element durch Aktualisieren der Eigenschaft (Datenbindung) mit einem leeren Pfad (New Path()) zu löschen Es ist nicht vollständig aktualisiert/gelöscht. Wenn ich die Fenstergröße etwas ändere, wird der Bereich, in dem der BitmapCache aktiv ist, vollständig gelöscht.WPFs BitmapCache ist nicht vollständig gelöscht

Gibt es etwas Besonderes, um ein Element, das BitmapCache verwendet, zu löschen/zu aktualisieren?

Dies ist unser Code:

<me:ScrollViewer 
    RenderedWaves="{Binding RenderedWaves}" 
    ItemTemplate="{DynamicResource DataTemplateForWaveItem}" 
    ItemsPanel="{DynamicResource ItemsPanelTemplateForWaveItems}" 
    CacheMode="BitmapCache" /> 

Ich dachte, ich es fest, aber es funktioniert nicht jedes Mal ...

Dieser Code den Pfad zu setzen doesn‘ t Aktualisieren Sie den BitmapCache sofort:

Protected WriteOnly Property SetGraph As Path 
Set(value As Path) 
    If value Is Nothing Then value = GetEmptyPath() 
    _graph = value 
    OnPropertyChanged(New PropertyChangedEventArgs(PropertyNameGraph)) 
End Set 
End Property 
manchmal

Und dieser Code aktualisiert ihn:

Protected WriteOnly Property SetGraph As Path 
Set(value As Path) 
    UIDispatcherLocator.UIDispatcher.Invoke(Sub() 
               If value Is Nothing Then value = GetEmptyPath() 
               _graph = value 
              End Sub, Threading.DispatcherPriority.Background) 
    OnPropertyChanged(New PropertyChangedEventArgs(PropertyNameGraph)) 
End Set 
End Property 
+0

Sie können uns ein bisschen mehr erzählen? Warum so kompliziert? –

+0

Wenn ich ein Wettmann wäre, würde ich sagen, dass Sie Probleme mit der Vidya-Karte haben. Kannst du ein minimales Beispiel für das Repros geben? – Will

+0

Sie könnten InvalidateVisual() von code-behind aufrufen, um zu sehen, ob das hilft – ekholm

Antwort

0

könnten Sie haben gerade ein neues Ereignis auf dem Objekt gemacht, wenn nötig Feuer und wann würden gesetzt Objekt aufgerufen = neues Objekt, das durch eine Verwendung Anweisung vorübergehend erstellt wurde, wenn Sie könnten es von system.idisposable übernehmen oder wenn Sie es einfach auf Null setzen, wenn Sie fertig sind? Ich kenne den Code dafür nicht von oben, aber so etwas wie:

MyEvent += new event(object b); 

event(object b) 
{ 
    using (custom_ScrollViewer = new custom_ScrollViewer) 
{ 
OnScreen_ScrollViewer = Custom_ScrollViewer; 

}; 
// or 
custom_ScrollViewer = new custom_ScrollViewer; 
OnScreen_ScrollViewer = Custom_ScrollViewer; 
custom_ScrollViewer = null; 

}