2015-06-10 43 views
1

我有大型樹視圖充滿了文本框,每個都帶有包含獨特圖像的工具提示。圖像以字節陣列的形式存儲在屬性中,並與之綁定。每次顯示新的工具提示時都會使用更多的內存。如何通過綁定到bytearray來顯示圖像時防止內存泄漏?

我將縮放圖像,但這並沒有解決問題的根源。如果在工具提示不再顯示之後有辦法釋放使用的內存嗎?

<TextBlock.ToolTip> 
    <StackPanel> 
     <Image MaxWidth="650" 
       MaxHeight="400" 
       Source="{Binding ImageAsByteArray}"/> 
     <TextBlock Text="{Binding FilePath, StringFormat='Full Path: {0}'}" /> 
    </StackPanel> 
</TextBlock.ToolTip> 

回答

0

的提示可以設置爲任何框架元素,因此可以動態創建此作爲幕後的對象:

<TextBlock ToolTip={Binding ToolTip} /> 

然後您的視圖模型或後面的代碼可以動態創建該對象和處理當工具提示顯示時,加載/卸載的事件將被捕獲。

我已經用帆布做了下面是要添加其他孩子除了圖像的情況下:

var tooltipCanvas = new Canvas(); 
var img = new Image(); 

tooltipCanvas.Children.Add(img); 
tooltipCanvas.Width = 500; 
tooltipCanvas.Height = 500; 
tooltipCanvas.Loaded += Tooltip_Loaded; 
tooltipCanvas.Unloaded += Tooltip_Unloaded; 

然後,你可以填充圖像源只是時間的圖像是使用加載顯示和卸載的事件處理程序:

private void Tooltip_Loaded(object sender, RoutedEventArgs e) 
{ 
    var canvas = sender as Canvas; 
    var img = canvas.Children[0] as Image; 
    img.Source = /* get your image bytes */; 
} 

private void Tooltip_Unloaded(object sender, RoutedEventArgs e) 
{ 
    var canvas = sender as Canvas; 
    var img = canvas.Children[0] as Image; 
    img.Source = null; 
} 
+0

你測試過了嗎?當我這樣做時,我無法釋放內存。我綁定到XAML中的bytearray,捕獲正在卸載的畫布的事件,併成功將該子項投射到一個圖像。將源設置爲null不會釋放內存。我也嘗試BindingOperations.ClearBinding沒有運氣。 – Brandon

+0

一旦垃圾收集發生後,你確定一分鐘後內存不會釋放嗎?您可以使用內存分析器來證明這一點 - 或者(僅適用於diags)強制GC.Collect操作來證明它是否釋放內存... –

+0

對於測試,我在設置圖像源後強制GC.Collect爲空。隨着更多工具提示的打開/關閉,內存使用量繼續攀升。 – Brandon

相關問題