C# 在UWP中删除导航缓存
在我的UWP应用程序中,我不断地从第1页导航到第2页,再从第2页导航到第1页,这个导航循环在两个页面的提交按钮上重复。在应用程序启动时,它的性能很好,但当页面进一步导航时,它占用了更多内存,并且应用程序在导航15或20次后速度变慢。我试图通过减小导航缓存的大小来删除它,但没有帮助。在我的研究中,我发现如果导航模式设置为enabled(启用),则会减少一些内存使用。但当我保持启用状态时,以前的数据不会被删除。我需要一个解决方案来删除以前页面的内存,并使我的应用程序使用更少的内存,即使它浏览了很多次 问题是UWP引擎不会破坏您的页面,即使它不再在Navigation堆栈中 但有解决办法:C# 在UWP中删除导航缓存,c#,performance,memory-leaks,uwp,uwp-xaml,C#,Performance,Memory Leaks,Uwp,Uwp Xaml,在我的UWP应用程序中,我不断地从第1页导航到第2页,再从第2页导航到第1页,这个导航循环在两个页面的提交按钮上重复。在应用程序启动时,它的性能很好,但当页面进一步导航时,它占用了更多内存,并且应用程序在导航15或20次后速度变慢。我试图通过减小导航缓存的大小来删除它,但没有帮助。在我的研究中,我发现如果导航模式设置为enabled(启用),则会减少一些内存使用。但当我保持启用状态时,以前的数据不会被删除。我需要一个解决方案来删除以前页面的内存,并使我的应用程序使用更少的内存,即使它浏览了很多次
NavigationCacheMode
OnNavigatedTo()
,当导航模式
为新建时,需要更改导航缓存模式
OnNavigatingFrom()
,当导航模式
为返回时,将禁用更改导航缓存模式
protected override void OnNavigatedTo( NavigationEventArgs navigationEvent )
{
// call the original OnNavigatedTo
base.OnNavigatedTo( navigationEvent );
// when the dialog displays then we create viewmodel and set the cache mode
if( CreatedViewModel == null || navigationEvent.NavigationMode == NavigationMode.New )
{
// set the cache mode
NavigationCacheMode = NavigationCacheMode.Required;
// create viewmodel
CreatedViewModel = CreateViewModel( navigationEvent.Parameter );
DataContext = CreatedViewModel;
CreatedViewModel.InitializeAsync().ConfigureAwait( false );
}
}
protected override void OnNavigatingFrom( NavigatingCancelEventArgs navigationEvent )
{
// call the original OnNavigatingFrom
base.OnNavigatingFrom( navigationEvent );
// when the dialog is removed from navigation stack
if( navigationEvent.NavigationMode == NavigationMode.Back )
{
// set the cache mode
NavigationCacheMode = NavigationCacheMode.Disabled;
ResetPageCache();
}
}
private void ResetPageCache()
{
int cacheSize = ((Frame)Parent).CacheSize;
((Frame)Parent).CacheSize = 0;
((Frame)Parent).CacheSize = cacheSize;
}
一些注意事项:当您创建一个基本页并将此代码放入其中时,会更加舒适,并且您可以在每个页面中从该基本页派生。您读过这篇文章吗:是的,我读过。但问题是,如果我将NavigationMode保持为启用状态,则页面中以前的数据将无法运行。如果我根据用户在第1页中的输入进行了一些修改,并且在我从第2页返回时再次进行修改,那么这些修改将不会继续。但我希望每次回来都有新的一页。请出示您的性能分析器。如果执行强制GC收集,也会显示结果。