我用wpf实现了一个多页的画板程序。
画板的每一页都是我自实现的page控件。
在画板中,为了界面友好和便捷的页间跳转,我又实现了一个页导航栏控件,其中包含一个listbox,我将listbox的itemsrouce属性设置为画板中的page列表,listboxitem则通过visualbrush实时显示各页的内容。
可是,现在发现,当我关了画板窗口(程序没有完全关闭,还有其他功能在运行),并释放了导航栏之后,被导航栏吃掉的内存确一点也没释放。我可是专门实现并调用了导航栏中的dispose方法,其中清空了itemsrouce和listbox的各种style。(导航栏的dispose方法如下)
private bool _isDisposed = false;
public void Dispose()
{
if (!_isDisposed)
{
_isDisposed = true;
this.PagesList.ItemsSource = null;
this.PagesList.SelectedItem = null;
this.PagesList.ClearValue(ListBox.ItemsSourceProperty);
this.PagesList.ClearValue(ListBox.StyleProperty);
this.PagesList.ClearValue(ListBox.ItemContainerStyleProperty);
this.PagesList.ClearValue(ListBox.ItemTemplateProperty);
this.RootPanel.Children.Clear();
this.Resources.Clear();
ClearValue(Navigator.DataContextProperty);
ClearValue(Navigator.ContentProperty);
ClearValue(Navigator.RenderTransformProperty);
}
}
注:PagesList是导航中栏中的listbox控件
this则是导航栏控件,导航栏是派生自usercontrol,因此有一个content属性
请问,如何才能释放listboxitem中的visualbrush占用的内存。
private bool _isDisposed = false; public void Dispose() { if (!_isDisposed) { _isDisposed = true; this.PagesList.ItemsSource = null; this.PagesList.SelectedItem = null; this.PagesList.ClearValue(ListBox.ItemsSourceProperty); this.PagesList.ClearValue(ListBox.StyleProperty); this.PagesList.ClearValue(ListBox.ItemContainerStyleProperty); this.PagesList.ClearValue(ListBox.ItemTemplateProperty); this.RootPanel.Children.Clear(); this.Resources.Clear(); ClearValue(Navigator.DataContextProperty); ClearValue(Navigator.ContentProperty); ClearValue(Navigator.RenderTransformProperty); } }
.net程序内存释放没有那么实时的,如果确保visualbrush没有被引用的话,调一下GC.Collect强制回收试试,
visualbrush是在itemtemplate中定义的,而itemsrouce则是通过绑定实现的
在释放前使用一个bindingoptions.clearallbindings,效果就有了,虽然内存也不是实时释放,但还是可以回收的