2016-10-19 1 views
-1

がここに私のXAMLです漏れる:WPFリストボックスメモリは

<ListBox Grid.Row="4" HorizontalAlignment="Stretch" Margin="10,132,10,10" ScrollViewer.VerticalScrollBarVisibility="Disabled" Name="lbStatus" VerticalAlignment="Stretch" VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"/> 

と私のC#コード:

public void DisplayStatusMessage(string msg) 
    { 
     if (lbStatus.Dispatcher.CheckAccess()) 
     { 
      AddMessage(msg, Brushes.Black); 
     } 
     else 
     { 
      this.Dispatcher.BeginInvoke((Action)(() => 
      { 
      AddMessage(msg, Brushes.Black); 
      })); 
     } 
    } 



    private void AddMessage(string msg) 
    { 
    ListBoxItem status = new ListBoxItem(); 
    status.Content = DateTime.Now.ToString("MM-dd-yyyy HH:mm:ss:fff ") + msg; 

    lbStatus.Items.Add(status); 
    lbStatus.ScrollIntoView(status); 
    status = null; 
    } 

私はリストボックスのステータスが表示されるまでに(真の)ループ内DisplayStatusMessageを呼び出しています。私のアプリケーションは、一晩でかなり大きくなります。これは、リストボックスのメモリリークを示すようです。無限状態を表示するためのリストボックスに代わる方法はありますか?仮想化をリサイクルに設定すると漏れを防ぐことができたと思いましたか?

+0

あなたが最新の状態でそれをシンプルに保つために、その後、より良い永続化する前の状態を必要としない場合。 – Nair

+0

あなたはリストボックスから項目を削除することはありません。したがって、メモリ消費の増加以外に何が期待されますか? – Clemens

+0

これ以外にも、ListBoxItems(「コンテナ」)を直接作成してアイテムコンテナの仮想化とリサイクルをバイパスしています。代わりに、*データアイテム*(ここでは文字列)を作成し、ListBoxの 'ItemTemplate'プロパティを適切なDataTemplateに設定する必要があります。その後、ListBoxの 'ItemsSource'プロパティを' ObservableCollection 'にバインドし、そのコレクションにメッセージ文字列を追加/削除します。ここをクリックしてください:[データテンプレートの概要](https://msdn.microsoft.com/en-us/library/ms742521(v = vs.110).aspx) – Clemens

答えて

4

これは「漏れ」自体ではありません。 ListBoxに継続的にエントリを追加する場合は、一晩でさえも、何千ものエントリを持つことになります。これを避けるために

あなたが新しいものを追加すると、古いエントリを削除できます。

if (listbox.Items.Count > 100) 
    listbox.Items.RemoveAt(0); // 0 or 99, whichever is your oldest 
listbox.Items.Add(status); 
listbox.ScrollIntoView(status);