#c# #xaml #windows-phone-7
#c# #xaml #windows-phone-7
Вопрос:
Я создаю приложение для Windows Phone, и мне нужна страница настроек. Я разобрался, как задать настройки, но теперь мне нужно знать, как прочитать их с главной страницы.
Итак, из MainPage.xaml.cs мне нужно проверить, имеет ли значение ExitAlert значение true или false в Settings.cs, и я не могу понять, как. Я уверен, что это что-то простое.
Спасибо.
Ответ №1:
Обычно в Windows временные настройки (для конкретного экземпляра) хранятся в «PhoneApplicationService.Текущий.Состояние» и постоянные настройки будут сохранены в «System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings»
Согласно вашему запросу
вы можете сохранить значение на странице настроек следующим образом
if(PhoneApplicationService.Current.State.Contains("ExitAlert"))
PhoneApplicationService.Current.State["ExitAlert"] = value;
else
PhoneApplicationService.Current.State.Add("ExitAlert", value);
и вы можете получить доступ к значению с главной страницы следующим образом
if(PhoneApplicationService.Current.State.Contains("ExitAlert"))
value = (bool)PhoneApplicationService.Current.State["ExitAlert"];
if(value == true)
Messagebox.Show("Exit alert is set");
Надеюсь, это решит вашу проблему.
Комментарии:
1. При использовании изолированного хранилища значение будет общим для всех экземпляров приложения. Я думаю, что вопрос заключается только в том, чтобы разделить значение между страницами в одном экземпляре приложения. Значение из предыдущего вызова приложения не должно быть доступно для нового вызова. Если это так, я предлагаю вместо этого использовать ресурсы приложения (см. Мой ответ), поскольку они ограничены экземпляром приложения.
2. Я уже настроил ее для хранения в изолированном хранилище, так будет ли пример доступа к значению по-прежнему работать?
3. @Rev, да, вы можете использовать изолированное хранилище для совместного использования значения между страницами внутри приложения. Я бы поднял две проблемы. Во-первых, при использовании изолированного хранилища доступ будет медленнее, чем при использовании ресурсов приложения. Во-вторых, вам нужно позаботиться о том, чтобы значения в изолированном хранилище из предыдущего выполнения приложения не создавали никаких нежелательных ситуаций при новом выполнении приложения. Ни то, ни другое не является непреодолимым. Таким образом, это можно заставить работать с небольшой осторожностью, это просто не оптимально для вашей ситуации.
4. @Rev, я согласен с мистером визуалом Стюартом в том, что изолированное хранилище занимает больше времени, что влияет на производительность вашего приложения, поэтому лучше использовать PhoneApplicationService. Текущий. Состояние для временного сохранения настроек.
Ответ №2:
Чтобы разделить значение между страницами в экземпляре приложения, добавьте значение к ресурсам приложения на странице создания и получите значение из ресурса на другом.
Вот несколько вспомогательных методов, которые я часто использую, которые иллюстрируют, как использовать ресурсы приложения.
public static T GetResource<T>( object key ) where T : class
{
return Application.Current.Resources[ key ] as T;
}
public static T GetResourceValueType<T>( object key ) where T : struct
{
object value = Application.Current.Resources[ key ];
return (value != null)
? (T)value
: new T();
}
public static void SetResource( object key, object resource )
{
if ( Application.Current.Resources.Contains( key ) )
Application.Current.Resources.Remove( key );
Application.Current.Resources.Add( key, resource );
}
Обратите внимание, что SetResource работает с учетом того факта, что вы не можете изменить значение ресурса приложения после его установки, поэтому он удаляет старый ресурс, а затем добавляет новый. Разница между getResource и GetResourceValueType заключается в том, является ли тип типом ресурса CLR (т. Е. классом) или типом значения CLR (т. Е. структурой, такой как int или bool).
Для вашего примера вы могли бы использовать их следующим образом:
bool exitAlert_Page1 = true;
SetResource( "ExitAlert", exitAlert );
// elsewhere...
bool exitAlert_Page2 = GetResourceValueType<bool>( "ExitAlert" );
Обычно я использую эти вспомогательные методы для реализации методов get и set свойства C #, чтобы используемое значение ‘key’ было ограничено определением свойства.
Обновление: Поскольку эта тема поднималась ранее, я изложил ее с несколькими небольшими улучшениями и загружаемым кодом в сообщении в блогеhttp://www.visualstuart.net/blog2/2011/11/sharing-values-across-wp7-pages / . Наслаждайтесь!