2017-02-20 10 views
1

Я использую 4 тумблера на странице настроек. Я сохраняю их значение в localSetting, поэтому, когда пользователь перезагружает приложение, настройки все еще применяются. Но когда я выбираю (устанавливаю в on) несколько тумблеров при перезапуске страницы, включен только первый (самый высокий) переключатель (также самый высокий в коде).Выполнено только одно localSetting для тумблера UWP C#

Это мой код:

.cs

public Settings() 
{ 
    this.InitializeComponent(); 

    toggleSwitchPushNotifications.IsOn = Convert.ToBoolean(App.localSettings.Values["PushNotifications"]); 

    toggleSwitchFullScreen.IsOn = Convert.ToBoolean(App.localSettings.Values["FullScreen"]); 

    toggleSwitchDataCollecting.IsOn = Convert.ToBoolean(App.localSettings.Values["DataCollecting"]); 

    toggleSwitchTest.IsOn = Convert.ToBoolean(App.localSettings.Values["Test"]); 

} 

private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e) 
{ 
    App.localSettings.Values["PushNotifications"] = toggleSwitchPushNotifications.IsOn; 
    App.localSettings.Values["FullScreen"] = toggleSwitchFullScreen.IsOn; 
    App.localSettings.Values["DataCollecting"] = toggleSwitchDataCollecting.IsOn; 
    App.localSettings.Values["Test"] = toggleSwitchTest.IsOn; 
} 

.xaml

<ToggleSwitch Margin="10,10,10,5" Grid.Row="0" Foreground="White" x:Name="toggleSwitchPushNotifications" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Style="{StaticResource ToggleSwitchStyleGreen}" Toggled="ToggleSwitch_Toggled"/> 
<ToggleSwitch Margin="10,10,10,5" Grid.Row="1" Foreground="White" x:Name="toggleSwitchFullScreen" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Style="{StaticResource ToggleSwitchStyleGreen}" Toggled=" ToggleSwitch_Toggled"/> 
<ToggleSwitch Margin="10,10,10,5" Grid.Row="2" Foreground="White" x:Name="toggleSwitchDataCollecting" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Style="{StaticResource ToggleSwitchStyleGreen}" Toggled=" ToggleSwitch_Toggled"/> 
<ToggleSwitch Margin="10,10,10,5" Grid.Row="3" Foreground="White" x:Name="toggleSwitchTest" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Style="{StaticResource ToggleSwitchStyleGreen}" Toggled="ToggleSwitch_Toggled"/> 

Когда я кладу сообщение всплывающие окна после каждого toggleswitch.IsOn как это:

toggleSwitchPushNotifications.IsOn = Convert.ToBoolean(App.localSettings.Values["PushNotifications"]); 
    MessageDialog msgDialog0 = new MessageDialog("0."); 
    msgDialog0.ShowAsync(); 

    toggleSwitchFullScreen.IsOn = Convert.ToBoolean(App.localSettings.Values["FullScreen"]); 
    MessageDialog msgDialog1 = new MessageDialog("1."); 
    msgDialog1.ShowAsync(); 

    toggleSwitchDataCollecting.IsOn = Convert.ToBoolean(App.localSettings.Values["DataCollecting"]); 
    MessageDialog msgDialog2 = new MessageDialog("2."); 
    msgDialog2.ShowAsync(); 

    toggleSwitchTest.IsOn = Convert.ToBoolean(App.localSettings.Values["Test"]); 
    MessageDialog msgDialog3 = new MessageDialog("3."); 
    msgDialog3.ShowAsync(); 

Сообщения обращаются ar в случайном порядке, поэтому я думаю, что это проблема.

ответ

3

Вы можете исправить это с помощью пары различных методов:

  1. Создавая собственный переключены-EventHandler для каждого ToggleSwitch.
  2. Используя логическое поле, чтобы отслеживать, когда конструктор завершает

Проблема теперь, что ваш конструктор является «вызовом» ToggleSwitch_Toggled -метода. Это происходит, когда код устанавливает параметр toggleSwitchPushNotifications.IsOn. На этом этапе вы еще не инициализировали другие ToggleSwitches, поэтому их IsOn является ложным. Это перезаписывает их текущие настройки.

Вариант 1)

Таким образом, в XAML, определить собственные переключены-EventHandler для каждого ToggleSwitch:

<ToggleSwitch Margin="10,10,10,5" Grid.Row="0" Foreground="White" x:Name="toggleSwitchPushNotifications" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Toggled="ToggleSwitchPushNotifications_OnToggled"/> 
    <ToggleSwitch Margin="10,10,10,5" Grid.Row="1" Foreground="White" x:Name="toggleSwitchFullScreen" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Toggled=" ToggleSwitchFullScreen_OnToggled"/> 
    <ToggleSwitch Margin="10,10,10,5" Grid.Row="2" Foreground="White" x:Name="toggleSwitchDataCollecting" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Toggled=" ToggleSwitchDataCollecting_OnToggled"/> 
    <ToggleSwitch Margin="10,10,10,5" Grid.Row="3" Foreground="White" x:Name="toggleSwitchTest" Header="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut eu. " HorizontalAlignment="Left" VerticalAlignment="Top" Toggled="ToggleSwitchTest_OnToggled"/> 

И в код обработки этих событий для каждого ToggleSwitch отдельно:

public MainPage() 
    { 
     this.InitializeComponent(); 
     toggleSwitchPushNotifications.IsOn = Convert.ToBoolean(App.localSettings.Values["PushNotifications"]); 
     toggleSwitchFullScreen.IsOn = Convert.ToBoolean(App.localSettings.Values["FullScreen"]); 
     toggleSwitchDataCollecting.IsOn = Convert.ToBoolean(App.localSettings.Values["DataCollecting"]); 
     toggleSwitchTest.IsOn = Convert.ToBoolean(App.localSettings.Values["Test"]); 
    } 

    private void ToggleSwitchFullScreen_OnToggled(object sender, RoutedEventArgs e) 
    { 
     App.localSettings.Values["FullScreen"] = toggleSwitchFullScreen.IsOn; 
    } 

    private void ToggleSwitchDataCollecting_OnToggled(object sender, RoutedEventArgs e) 
    { 
     App.localSettings.Values["DataCollecting"] = toggleSwitchDataCollecting.IsOn; 
    } 

    private void ToggleSwitchTest_OnToggled(object sender, RoutedEventArgs e) 
    { 
     App.localSettings.Values["Test"] = toggleSwitchTest.IsOn; 
    } 

    private void ToggleSwitchPushNotifications_OnToggled(object sender, RoutedEventArgs e) 
    { 
     App.localSettings.Values["PushNotifications"] = toggleSwitchPushNotifications.IsOn; 
    } 

Вариант 2)

В качестве альтернативы, вы можете использовать логическую переменную для пропуска вызовов ToggleSwitch_Toggled из конструктора:

private bool initializing = true; 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     toggleSwitchPushNotifications.IsOn = Convert.ToBoolean(App.localSettings.Values["PushNotifications"]); 
     toggleSwitchFullScreen.IsOn = Convert.ToBoolean(App.localSettings.Values["FullScreen"]); 
     toggleSwitchDataCollecting.IsOn = Convert.ToBoolean(App.localSettings.Values["DataCollecting"]); 
     toggleSwitchTest.IsOn = Convert.ToBoolean(App.localSettings.Values["Test"]); 

     initializing = false; 
    } 

    private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e) 
    { 
     if (initializing) return; 

     App.localSettings.Values["PushNotifications"] = toggleSwitchPushNotifications.IsOn; 
     App.localSettings.Values["FullScreen"] = toggleSwitchFullScreen.IsOn; 
     App.localSettings.Values["DataCollecting"] = toggleSwitchDataCollecting.IsOn; 
     App.localSettings.Values["Test"] = toggleSwitchTest.IsOn; 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^