UWP на странице управления
Я хочу научиться управлять состоянием страницы между переходами.
например, переход на страницу 1, а затем я перехожу на страницу 2, но когда я возвращаюсь на страницу 1, элементы пользовательского интерфейса уже должны быть там с теми же данными, что и раньше, и они не должны быть повторно инициализированы или данные не должны быть снова привязаны компилятором.
Кроме того, что я могу сделать, чтобы управлять состоянием всего приложения таким образом, что я завершаю приложение, а затем, когда я запускаю его в следующий раз, то же самое состояние уже есть, как и в прошлый раз время. могу ли я применить его ко всему приложению? или что, если я хочу применить его только на нескольких страницах? любая помощь будет оценена с благодарностью.
1 ответ:
Или пример a перейдите на страницу 1, а затем я перейду на страницу 2, но когда я вернусь на страницу 1, элементы пользовательского интерфейса уже должны быть там с теми же данными, что и раньше, и они не должны быть повторно инициализированы или данные не должны быть снова привязаны компилятором.
Для этого вопроса Вы можете использовать UIElement.Свойство CacheMode и фрейм.Свойство CacheSize . СВОЙСТВО
Как мы знаем, приложение UWP по умолчанию используетCacheSizeзадает количество страниц в истории навигации, которые могут быть кэшированы для свойство frame, andCacheModeзадает значение, указывающее, что отображаемое содержимое должно быть кэшировано как составное растровое изображение, когда это возможно.rootFrameдля отображения нескольких страниц, мы просто используем методNavigationдля изменения содержимого во фрейме. Вы можете увидеть это в методеOnLaunched(LaunchActivatedEventArgs e)пустого приложения UWP. Но как реализовать функцию кэша? Например, ваше приложение имеет две страницы и один корневой фрейм. Вы можете определить свойствоCacheSizeв своем методеOnLaunched(LaunchActivatedEventArgs e)для пример:protected override void OnLaunched(LaunchActivatedEventArgs e) { ... // Ensure the current window is active rootFrame.CacheSize = 2; Window.Current.Activate(); }Затем в построенных вами двухстраничных функциях включите свойство
CacheMode, например:public MainPage() { this.InitializeComponent(); this.NavigationCacheMode = NavigationCacheMode.Enabled; }Также то, что я могу сделать, чтобы управлять состоянием всего приложения таким образом, что я завершаю приложение, а затем, когда я запускаю его в следующий раз, то же самое состояние уже есть, как и в прошлый раз. могу ли я применить его ко всему приложению?
Для этого вопроса вам нужно будет сохранить состояние страницы в методе
OnSuspending(object sender, SuspendingEventArgs e), используя фрейм .GetNavigationState метод , и вы можете сохранить это состояние в локальных настройках приложения. Например:private void OnSuspending(object sender, SuspendingEventArgs e) { var deferral = e.SuspendingOperation.GetDeferral(); Frame rootFrame = Window.Current.Content as Frame; string navstate = rootFrame.GetNavigationState(); var localSettings = ApplicationData.Current.LocalSettings; localSettings.Values["nav"] = navstate; deferral.Complete(); }И как получить эту информацию? Вы можете переопределить свой метод
OnLaunched(LaunchActivatedEventArgs e), и сначала вам нужно будет решить, как ваше приложение будет закрыто в последний раз, пользователем или системой с помощью перечисления ApplicationExecutionState , например так:protected override void OnLaunched(LaunchActivatedEventArgs e) { //#if DEBUG // if (System.Diagnostics.Debugger.IsAttached) // { // this.DebugSettings.EnableFrameRateCounter = true; // } //#endif Frame rootFrame = Window.Current.Content as Frame; // Do not repeat app initialization when the Window already has content, // just ensure that the window is active if (rootFrame == null) { // Create a Frame to act as the navigation context and navigate to the first page rootFrame = new Frame(); rootFrame.NavigationFailed += OnNavigationFailed; if (e.PreviousExecutionState == ApplicationExecutionState.Terminated) { //TODO: Load state from previously suspended application } // Place the frame in the current Window Window.Current.Content = rootFrame; } if (rootFrame.Content == null) { // When the navigation stack isn't restored navigate to the first page, // configuring the new page by passing required information as a navigation // parameter //rootFrame.Navigate(typeof(MainPage), e.Arguments); if (e.PreviousExecutionState == ApplicationExecutionState.Terminated || e.PreviousExecutionState == ApplicationExecutionState.ClosedByUser) { object value; var localSettings = ApplicationData.Current.LocalSettings; if (localSettings.Values.TryGetValue("nav", out value)) { rootFrame.SetNavigationState(value as string); } else { rootFrame.Navigate(typeof(MainPage), e.Arguments); } } else { rootFrame.Navigate(typeof(MainPage), e.Arguments); } } // Ensure the current window is active rootFrame.CacheSize = 2; Window.Current.Activate(); }Но имейте в виду, что при закрытии приложения, в следующий раз, когда вы запустите это приложение, элементы пользовательского интерфейса будут повторно инициализированы, эта функция может только перейдите на страницу, когда вы в последний раз закрывали приложение, но данные на этой странице будут потеряны. Но вы также можете сохранить данные в локальных настройках и при переходе на страницу установить значение для этих элементов пользовательского интерфейса.
Comments