我创建了一个简单的应用程序,它会泄漏内存:
视图
<Page
...
x:Class="App3.MainPage"
mc:Ignorable="d">
<StackPanel>
<Image Width="300" Height="200"
Source="/Assets/BBlHOiv.jpg"></Image>
<Button Click="Button_Click">Navigate</Button>
</StackPanel>
</Page>
后台代码
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private void Button_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
this.Frame.Navigate(typeof(MainPage));
}
每次点击按钮时,代码都会导航到同一个页面,该页面上有一张大约400KB的图片。如果我继续以快速的速度点击按钮,则每次点击或每隔几次点击内存就会增加。内存没有被回收,或者至少没有及时回收。在一个真实的应用程序中,由于页面更加复杂、导航更加复杂(包括循环导航),这可能成为一个大问题。问题是如何强制应用程序释放内存?理想情况下,一旦不再需要/显示页面。
我尝试了以下事项但没有成功。
#1 清除框架的导航堆栈
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
this.Frame.BackStack.Clear();
}
#2 使用MVVM时,将DataContext设置为null(当datacontext在XAML标记中设置时)
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
this.DataContext = null;
this.Frame.BackStack.Clear();
}