你可以做一些事情。首先是使用内存分析器。我个人喜欢RedGate ANTS Memory Profiler,它会告诉您您的对象是否正在清理,我相信他们有免费试用版可供您使用。
此外,您的图像是如何显示的?窗口是否从磁盘加载它们?如果图像数量很少,我建议将它们放在 ResourceDictionary 中,如下所示:
<BitmapImage UriSource="/MyApp.Client;component/Images/Pinned.png" x:Key="Pinned" PresentationOptions:Freeze="True" />
<BitmapImage UriSource="/MyApp.Client;component/Images//Unpinned.png" x:Key="Unpinned" PresentationOptions:Freeze="True" />
然后你可以在你的 XAML 中使用:
<Image Source="{StaticResource: Unpinned}"/>
这将确保您的图片只加载一次。所有需要它的东西都会引用它。
还请记住,如果您在窗口上订阅了任何事件,它可能会阻止您的窗口关闭。当窗口关闭时,您应该始终取消引用您的事件。例如:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += DoStuff();
}
private RoutedEventHandler DoStuff()
{
//some code here
}
protected override void OnClosing(CancelEventArgs e)
{
base.OnClosing(e);
Loaded -= DoStuff();
}
}
注意泛型方法。例如,如果您这样做:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Loaded += (o, e) =>
{
//Do stuff here
};
}
}
没有办法取消引用,因为该方法是通用的,所以没有什么可以在关闭时删除它。这是内存泄漏和阻止窗口关闭的一个非常常见的问题。
另一个经常被忽略的常见类是 Timer 类。如果您启动一个计时器,然后在不停止计时器的情况下关闭窗口,则 Timer 类将保存对您的窗口的引用,以防止它被关闭。始终确保您的计时器在窗口关闭时停止。