2017-09-06 5 views
0

hereから次のコードをコピーしました。私はxamlスライダに二重の値をバインドし、SettingsPageにナビゲートするたびにlocalsettingからこの値を取得し、スライダ値がlocalsettingsに保存されるようにユーザによって変更されるたびに取得します。ここに私のコードは、これまでのところです:UWP - 設定の保存が常に機能しない

SettingsPage.xaml.cpp:

Windows::Storage::ApplicationDataContainer^ localSettings = Windows::Storage::ApplicationData::Current->LocalSettings; 


SettingsPage::SettingsPage() 
{ 
    InitializeComponent(); 

    this->viewModel = ref new SettingsViewModel(); 
    this->DataContext = this->viewModel; 
} 

void SettingsPage::QSlider_ValueChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::Primitives::RangeBaseValueChangedEventArgs^ e) 
{ 
    Windows::Storage::ApplicationDataCompositeValue^ composite =ref new Windows::Storage::ApplicationDataCompositeValue(); 
    bool a = composite->Insert(SETTINGS_TAG_SLIDER_Q, dynamic_cast<PropertyValue^>(PropertyValue::CreateDouble((double)sldQ->Value))); 

    auto values = localSettings->Values; 
    bool b = values->Insert(SETTINGS_TAG_SETTINGS_PAGE, composite); 
} 

SettingsPage.xaml:

<Slider x:Name="sldQ" Margin="15,5,15,0" Value="{Binding SliderQValue}" ValueChanged="Slider_ValueChanged" MaxWidth="300" HorizontalContentAlignment="Left" ></Slider> 

がSettingsViewModel.cpp:

double SettingsViewModel::SliderQValue::get() 
{ 
    Windows::Storage::ApplicationDataContainer^ localSettings = Windows::Storage::ApplicationData::Current->LocalSettings; 
    ApplicationDataCompositeValue^ composite = safe_cast<ApplicationDataCompositeValue^>(localSettings->Values->Lookup(SETTINGS_TAG_SETTINGS_PAGE)); 
    if (composite != nullptr) 
    { 
     if (composite->HasKey(SETTINGS_TAG_SLIDER_Q)) { 
      double value = safe_cast<IPropertyValue^>(composite->Lookup(SETTINGS_TAG_SLIDER_Q))->GetDouble(); 
      return value; 
     } 
    } 
    return 99; 
} 

私の問題があることですこれは一度だけ機能します!他のページからSettingsPageに移動すると、slidervalue = 99と表示されます。次に、私はそれをドラッグして設定します。 50.次に、他のページに戻ります。他のページから、もう一度SettingsPageに移動し、slidervalue = 50を取得します。しかし、もう一度やり直すと、もう一度99になる。したがって、1ページのナビゲーションサイクルでのみ動作しますが、アプリが再起動しても動作するはずです。私のコードの問題は何ですか?何か間違ったことを理解していますか

答えて

0

私は実際にthisの助けを借りて問題を解決しました。上記の私のコードでは、新しい「ApplicationDateCompositeValue」を書く/読んでみるたびに初期化していました。だから、それが行うことに予定されていたようにそれが動作する新しい方法:

がOnValueChanged:

Windows::Storage::ApplicationDataContainer^ localSettings = Windows::Storage::ApplicationData::Current->LocalSettings; 
    auto values = localSettings->Values; 
    values->Insert(TAG_SLIDER, dynamic_cast<PropertyValue^>(PropertyValue::CreateDouble((double)sldQuality->Value))); 

プロパティ::取得():

ApplicationDataContainer^ localSettings = ApplicationData::Current->LocalSettings; 
    auto values = localSettings->Values; 
    if (localSettings->Values->HasKey(TAG_SLIDER)) { 
     double value = safe_cast<double>(localSettings->Values->Lookup(TAG_SLIDER)); 
     return value; 
    } 
    else 
     return default_value; 
関連する問題