UWP на странице управления



Я хочу научиться управлять состоянием страницы между переходами.
например, переход на страницу 1, а затем я перехожу на страницу 2, но когда я возвращаюсь на страницу 1, элементы пользовательского интерфейса уже должны быть там с теми же данными, что и раньше, и они не должны быть повторно инициализированы или данные не должны быть снова привязаны компилятором.
Кроме того, что я могу сделать, чтобы управлять состоянием всего приложения таким образом, что я завершаю приложение, а затем, когда я запускаю его в следующий раз, то же самое состояние уже есть, как и в прошлый раз время. могу ли я применить его ко всему приложению? или что, если я хочу применить его только на нескольких страницах? любая помощь будет оценена с благодарностью.

416   1  

1 ответ:

Или пример a перейдите на страницу 1, а затем я перейду на страницу 2, но когда я вернусь на страницу 1, элементы пользовательского интерфейса уже должны быть там с теми же данными, что и раньше, и они не должны быть повторно инициализированы или данные не должны быть снова привязаны компилятором.

Для этого вопроса Вы можете использовать UIElement.Свойство CacheMode и фрейм.Свойство CacheSize . СВОЙСТВО CacheSize задает количество страниц в истории навигации, которые могут быть кэшированы для свойство frame, and CacheMode задает значение, указывающее, что отображаемое содержимое должно быть кэшировано как составное растровое изображение, когда это возможно.

Как мы знаем, приложение UWP по умолчанию использует 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

    Ничего не найдено.