Windows phone 8个文件存储C++

Windows phone 8 file storage C++

我开始使用 C++ Windows phone。 目前我正在做一个有很多页面的 windows phone 应用程序,我不知道如何保存和加载我的数据。我尝试了全局变量和 SQLite 数据库,但我总是遇到错误,所以我尝试了“Windows::Storage::ApplicationDataContainer”,但我无法在所有页面之间传递变量。 是否有人拥有使用 ApplicationDataContainer 的模板,或者有人可以向我解释如何使用它?

这是我的代码

MainPage.xaml.cpp

#include "pch.h"
#include "MainPage.xaml.h"
#include "menu.xaml.h"

using namespace japanEasy;
using namespace Windows::Storage;
using namespace Platform;
using namespace std;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Interop;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Popups;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;

ApplicationDataContainer^ localSettings = ApplicationData::Current->LocalSettings;
// Pour en savoir plus sur le modèle d'élément Page vierge, consultez la page http://go.microsoft.com/fwlink/?LinkId=234238
MainPage::MainPage()
{
    InitializeComponent();
}

/// <summary>
/// Invoqué lorsque cette page est sur le point d'être affichée dans un frame.
/// </summary>
/// <param name="e">Données d'événement décrivant la manière dont l'utilisateur a accédé à cette page.  La propriété Parameter
/// est généralement utilisée pour configurer la page.</param>
void MainPage::OnNavigatedTo(NavigationEventArgs^ e)
{
    (void) e;   // Paramètre non utilisé
}

void japanEasy::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{               
    if (this->theName->Text == "" || this->theName->Text == nullptr)
    {
        auto msgDlg = ref new MessageDialog("Vous devez d'abord saisir votre nom", "Attention");
        msgDlg->ShowAsync();
    }
    else
    {
        auto values = localSettings->Values;
        values->Insert("playerName", dynamic_cast<PropertyValue^>(PropertyValue::CreateString(this->theName->Text)));
        String^ value = safe_cast<String^>(localSettings->Values->Lookup("playerName"));
        this->Frame->Navigate(TypeName(japanEasy::menu::typeid), localSettings);
    }
}

menu.xaml.cpp

#include "pch.h"
#include "menu.xaml.h"
#include "learn.xaml.h"
#include "level.xaml.h"
#include "records.xaml.h"
#include "easyGame.xaml.h"

using namespace japanEasy;    
using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Interop;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
using namespace Windows::Storage;

ApplicationDataContainer^ localSettings ;
menu::menu()
{
    InitializeComponent();      
    this->myName->Text = safe_cast<String^>(localSettings->Values->Lookup("playerName"));
}

/// <summary>
/// Invoqué lorsque cette page est sur le point d'être affichée dans un frame.
/// </summary>
/// <param name="e">Données d'événement décrivant la manière dont l'utilisateur a accédé à cette page.
/// Ce paramètre est généralement utilisé pour configurer la page.</param>
void menu::OnNavigatedTo(NavigationEventArgs^ e)
{
    (void) e;   // Paramètre non utilisé
    auto localSettings = (ApplicationDataContainer^)e->Parameter;
    ::Windows::UI::Xaml::Controls::Page::OnNavigatedTo(e);

}


void japanEasy::menu::goToLearn_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    this->Frame->Navigate(TypeName(japanEasy::learn::typeid));
}


void japanEasy::menu::goTo_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{

}


void japanEasy::menu::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    this->Frame->Navigate(TypeName(japanEasy::level::typeid));
}


void japanEasy::menu::goToRecords_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    this->Frame->Navigate(TypeName(japanEasy::records::typeid));
}

当我在 windows phone 上启动我的应用程序时,我获取了我的用户名,然后单击我的按钮以显示 "menu.xaml" 页面,我应该得到此页面中的名称归功于 "localSettings" 我已经通过导航功能传递了我的 MainPage.xaml.cpp。

为了将数据从一个页面传递到另一个页面,我使用了 "Page::OnNavigatedTo" 方法。 所以在我的 menuPage 上我创建了一个全局变量并添加了一个 menu::OnNavigatedTo() 我从前几页获取数据的地方。 这是我的 menuPage.xaml.cpp

#include "pch.h"
#include "menu.xaml.h"
#include "learn.xaml.h"
#include "level.xaml.h"
#include "records.xaml.h"
#include "easyGame.xaml.h"
#include "mediumGame.xaml.h"
#include "hardGame.xaml.h"
#include "Constants.h"

using namespace japanEasy;
using namespace Platform;
using namespace std;
using namespace Windows::UI::Popups;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Interop;
using namespace Windows::UI::Xaml::Controls;
using namespace Windows::UI::Xaml::Controls::Primitives;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;
using namespace Windows::UI::Xaml::Navigation;
using namespace Windows::Phone::UI::Input;
using namespace Windows::Storage;

ApplicationDataContainer^ menuLocalSetting;
String^ lv = "Facile";

// Create a composite setting
ApplicationDataCompositeValue^ recordList = ref new ApplicationDataCompositeValue();

menu::menu()
{
InitializeComponent();  
HardwareButtons::BackPressed += ref new EventHandler<BackPressedEventArgs ^>(this, &menu::HardwareButtons_BackPressed);
}

/// <summary>
/// Invoqué lorsque cette page est sur le point d'être affichée dans un frame.
/// </summary>
/// <param name="e">Données d'événement décrivant la manière dont l'utilisateur a accédé à cette page.
/// Ce paramètre est généralement utilisé pour configurer la page.</param>
void menu::OnNavigatedTo(NavigationEventArgs^ e)
{
    //(void) e; // Paramètre non utilisé

if (e->Parameter) {
    menuLocalSetting = safe_cast<ApplicationDataContainer^>(e->Parameter);
    this->myName->Text = safe_cast<String^>(menuLocalSetting->Values->Lookup("userName"));
    auto values = menuLocalSetting->Values;
    if (safe_cast<String^>(menuLocalSetting->Values->Lookup("level"))) {
        String^ value = safe_cast<String^>(menuLocalSetting->Values->Lookup("level"));
        lv = value;
    }
    else {
        auto vvv = menuLocalSetting->Values;
        vvv->Remove("level");
        vvv->Insert("level", dynamic_cast<PropertyValue^>(PropertyValue::CreateString("Facile")));
        String^ test3 = safe_cast<String^>(menuLocalSetting->Values->Lookup("level"));

    }
}
}

void japanEasy::menu::goToLearn_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    this->Frame->Navigate(TypeName(japanEasy::learn::typeid), menuLocalSetting);
}

void japanEasy::menu::goTo_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
if(lv == "Facile")
    this->Frame->Navigate(TypeName(japanEasy::easyGame::typeid), menuLocalSetting);
else if(lv =="Moyen")
    this->Frame->Navigate(TypeName(japanEasy::mediumGame::typeid), menuLocalSetting);
else if(lv == "Difficile")
    this->Frame->Navigate(TypeName(japanEasy::hardGame::typeid), menuLocalSetting);
}

void japanEasy::menu::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
this->Frame->Navigate(TypeName(japanEasy::level::typeid), menuLocalSetting);
}

void japanEasy::menu::goToRecords_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
this->Frame->Navigate(TypeName(japanEasy::records::typeid), menuLocalSetting);
    }

//on ajoute une fonction qui gère la back navigation
void menu::HardwareButtons_BackPressed(Object^ sender, Windows::Phone::UI::Input::BackPressedEventArgs^ e)
{
if (this->Frame->CanGoBack)
{
    //On ferme l'application si l'utilisateur clique sur le bouton back du menu
    Application::Current->Exit();
    e->Handled = true;
}
}