2017-09-06 3 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; 
관련 문제