私のUWP Windows 10アプリケーションで奇妙な動作が確認されました。ページから戻るとページがアンロードされても、ページは引き続きイベントを放出します。たとえば、私がナビゲートした古いページは、まったく別のページに行っても「LayoutUpdated」イベントを出します。UWPアプリケーションでまだページが表示されない
私はこれを実証するための最小限の例を用意しました(コードは以下です)。それはかなり簡単です:
メインページとサンプルページがあります。 MainPageからExamplePageに移動し、ExamplePageからMainPageに戻ることができます。
ExamplePageに移動するたびに、新しく作成されたページに新しいIDが与えられます(ページはキャッシュされません)。
ExamplePageのグリッドはLayoutChangedイベントを送出します。そして、イベントハンドラは、「ページ0で更新されたグリッドレイアウト」のように、デバッグコンソールにテキストを書き込みます。 0は私がそのページに与えたページIDです。
数回前に戻ると、古いページでもレイアウトの更新テキストがコンソールに書き込まれます。私はID 3でページに移動した場合、それはコンソールに書き込みます:更新されたページ3
グリッドレイアウトに更新されたページ0
グリッドレイアウトに更新
グリッドレイアウトページ1つの
グリッドレイアウトは、2
ないページに更新します古いページはまだレイアウトを更新しています。古いページはもうイベントを発行してはいけませんが、もうイベントに出ることはなく、アンロードされます。ここで
は、ちょうどその新しいUWP VS2015でのプロジェクトと作成5つのファイルがあり、コードです:MainPage.xamlをし
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Button x:Name="NavigationButton"
Click="NavigationButton_Click"
HorizontalAlignment="Center"
VerticalAlignment="Top"
Margin="0,20,0,0">Navigate</Button>
</Grid>
MainPage.xaml.cs
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace App7
{
public sealed partial class MainPage : Page
{
private App app;
public MainPage()
{
this.InitializeComponent();
app = (App)Application.Current;
}
private void NavigationButton_Click(object sender, RoutedEventArgs e)
{
var viewModel = new ExamplePageViewModel(app.GetPageId());
Frame.Navigate(typeof(ExamplePage), viewModel);
}
}
}
ExamplePage.xaml
<Grid x:Name="MainGrid"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
LayoutUpdated="MainGrid_LayoutUpdated">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button x:Name="NavigationButton"
Click="NavigationButton_Click" HorizontalAlignment="Center"
Margin="0,20,0,0">Go Back</Button>
<TextBlock Text="{Binding PageId}"
Grid.Row="1"
FontSize="30"
HorizontalAlignment="Center"></TextBlock>
</Grid>
ExamplePage.xaml.cs
using System.Diagnostics;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace App7
{
public sealed partial class ExamplePage : Page
{
private ExamplePageViewModel viewModel;
public ExamplePage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.NavigationMode == NavigationMode.New ||
e.NavigationMode == NavigationMode.Back)
{
viewModel = (ExamplePageViewModel)e.Parameter;
DataContext = viewModel;
}
}
private void NavigationButton_Click(object sender, RoutedEventArgs e)
{
Frame.GoBack();
}
private void MainGrid_LayoutUpdated(object sender, object e)
{
Debug.WriteLine("grid layout updated on page " + viewModel?.PageId.ToString());
}
}
}
ExamplePageViewModel.cs
using System.ComponentModel;
using Windows.UI.Xaml;
namespace App7
{
public class ExamplePageViewModel : INotifyPropertyChanged
{
private App app;
private int pageId;
public event PropertyChangedEventHandler PropertyChanged;
public int PageId
{
get
{
return pageId;
}
}
public ExamplePageViewModel(int pageId)
{
app = (App)Application.Current;
this.pageId = pageId;
}
}
}
注:のviewmodelはちょうどまだイベントをemitingされたページはっきりと確認することです。ビューモデルを削除することはできますが、問題は変わりません。
よろしくお願いいたします。複雑なページがまだメモリに残っている場合、これはアプリのパフォーマンスを低下させませんか?私のアプリでは、何十もの複雑なページがLayoutUpdatedイベントを発生させていることが分かるので、すべてのコントロールはすべてのページナビゲーションでサイズを計算していますよね?私はLayoutUpdatedイベントに不要なコードを入れないでしょう、または私は戻ってナビゲートする際にそれらをアンバインドしますが、それでも、すべてのコントロールのサイズを独自に再計算しますか? もう1つ質問:コントロールがビジュアルツリーにない場合でも、他のイベントが発生しますか?どのようにそのようなイベントのリストを見つけることができますか? –