сохранение переменных wp7 - PullRequest
3 голосов
/ 12 марта 2011

Какой лучший способ сохранить переменные, такие как идентификатор пользователя, который хранится и доступен с разных страниц в WP7.

Ответы [ 3 ]

5 голосов
/ 12 марта 2011

Существует метод строки запроса, но его реализация может быть затруднена.

При навигации передайте параметр как строку запроса HTTP.

Затем, на другой стороне, проверьте, существует ли ключ, и извлеките значение. Недостатком этого является то, что если вам нужно сделать больше 1, вам нужно ввести его самостоятельно, и он поддерживает только строки.

Итак, чтобы передать целое число, вам нужно его преобразовать. (И чтобы передать сложный объект, вам нужно взять все части, которые вам нужны, чтобы перекомпилировать его на другой стороне)

NavigationService.Navigate(new Uri("/PanoramaPage1.xaml?selected=item2", UriKind.Relative));

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        string selected = String.Empty;

        //check to see if the selected parameter was passed.
        if (NavigationContext.QueryString.ContainsKey("selected"))
        {
            //get the selected parameter off the query string from MainPage.
            selected = NavigationContext.QueryString["selected"];
        }

        //did the querystring indicate we should go to item2 instead of item1?
        if (selected == "item2")
        {
            //item2 is the second item, but 0 indexed. 
            myPanorama.DefaultItem = myPanorama.Items[1];
        }
        base.OnNavigatedTo(e);
    }

Вот пример приложения, которое использует строку запроса. http://dl.dropbox.com/u/129101/Panorama_querystring.zip

Более простая (и лучшая) идея - определить переменную глобально или использовать статический класс. В App.xaml.cs определите

using System.Collections.Generic;

public static Dictionary<string,object> PageContext = new Dictionary<string,object>;

Затем на первой странице просто выполните

MyComplexObject obj;
int four = 4;
...

App.PageContext.Add("mycomplexobj",obj);
App.PageContext.Add("four",four);

Затем на новой странице просто сделайте

MyComplexObj obj = App.PageContext["mycomplexobj"] as MyComplexObj;
int four = (int)App.PageContext["four"];

Чтобы быть в безопасности, вы, вероятно, должны проверить, существует ли объект:

if (App.PageContext.ContainsKey("four"))
int four = (int)App.PageContext["four"];
1 голос
/ 12 марта 2011

Ну, «лучший» всегда субъективен, однако, я думаю, что сервис приложений - хороший кандидат для такого рода вещей: -

public interface IPhoneApplicationService : IApplicationService
{
     string Name {get; set;}
     object Deactivating();
     void Activating(object state);
}

public class AuthenticationService : IPhoneApplicationService
{
    public static AuthenticationService Current {get; private set; }

    public void StartService(ApplicationServiceContext context)
    {
        Current = this;
    }

    public void StopService()
    {
        Current = null;
    }

    public string Name {get; set;}

    public object Deactivating()
    {
        // Return an serialisable object such as a Dictionary if necessary.
        return UserID;
    }

    public void Activating(object state)
    {
        UserID = (int)state;
    }

    public int UserID { get; private set; }

    public void Logon(string username, string password)
    {
        // Code here that eventually assigns to UserID.
    }
}

Вы помещаете экземпляр этого в свой App.xaml: -

<Application.ApplicationLifetimeObjects>
    <!--Required object that handles lifetime events for the application-->

    <shell:PhoneApplicationService 
        Launching="Application_Launching" Closing="Application_Closing" 
        Activated="Application_Activated" Deactivated="Application_Deactivated"/>

    <local:AuthenticationService Name="AuthServ" />

</Application.ApplicationLifetimeObjects>

Теперь вам нужно настроить App.xaml.cs: -

    private void Application_Activated(object sender, ActivatedEventArgs e)
    {
        var state = PhoneApplicationService.Current.State;
        foreach (var service in ApplicationLifetimeObjects.OfType<IPhoneApplicationService>())
        {
            if (state.ContainsKey(service.Name))
            {
                service.Activating(state[service.Name]);
            }
        }
    }

    private void Application_Deactivated(object sender, DeactivatedEventArgs e)
    {
        var state = PhoneApplicationService.Current.State;
        foreach (var service in ApplicationLifetimeObjects.OfType<IPhoneApplicationService>())
        {
            if (state.ContainsKey(service.Name))
            {
                state[service.Name] = service.Deactivating();
            }
            else
            {
                state.Add(service.Name, service.Deactivating());
            }
        }
    }

Теперь вы можете получить доступ к своему идентификатору пользователя в любом месте вашего приложения с помощью: -

 AuthenticationService.Current.UserID

Этот общий шаблон можно использовать для разделения отдельных ключевых приложений (вы не загружаете целую кучу несвязных свойств в свой класс App). Он также предоставляет хуки для поддержания состояния между активациями, что очень важно.

1 голос
/ 12 марта 2011

Вы можете использовать переменную уровня приложения (определенную в App.xaml.cs) и получать к ней доступ из любого места в вашем приложении. Если вы хотите сохранить, поместите его в изолированное хранилище и прочитайте его при запуске / активации приложения. Есть помощники, доступные JSon для сериализации / десериализации ваших операций чтения / записи из изолированного хранилища.

Ознакомьтесь с публикацией Джеффа ( здесь ) о советах по использованию изолированного хранилища.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...