2013-04-15 66 views
2

我正在爲使用HTML5/JavaScript的WP8開發應用程序。 我收集JavaScript中數組變量的用戶設置,並非常希望保存這些設置以供將來使用。並將其保存在漫遊設置中以更加精確。Windows Phone 8中的應用程序設置,使用javascript

經過一番研究,似乎這是不可能的直接從js。我發現在Windows 8中執行此任務的API調用在WP8下不起作用。因此,只有變通,我可以想出是結構:

1)當我想保存的數據,從JS我做

window.external.notify("LaunchSaveProcess"); 

將通知發送到瀏覽器。

2)在XAML文件

<phone:WebBrowser ScriptNotify="Catch_Script_Notification" /> 

從瀏覽器將通知傳遞至c#

3)在C#捕獲通知

private void Catch_Script_Notification(object sender, NotifyEventArgs e) 
{ if (e.Value.StartsWith("LaunchSaveProcess")) { 
      //"important function" 
} } 

4) 「的重要功能」 調用方法在JavaScript中返回用戶設置數組,然後繼續保存數據使用

var userSettings = Browser.InvokeScript("getSettings()"); 
var roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings; 
roamingSettings.Values["settings"] = userSettings; 

現在幾個問題。 這個模型是正確的,還是有更簡單的方法來做到這一點?您可以在發出通知事件時以某種方式將參數從JavaScript直接傳遞給C#? 我可以直接將數組保存到roamingSettings中嗎,還是需要將它排除並將所有內容分開保存?

爲了澄清usersettings數組是1維數組,我用「鍵」和「值」對推對象。因此,我可以輕鬆地使用 userSettings [i] .key和.value語法訪問循環內的內容。

回答

0

另一種從C#調用JavaScript的方法是一次性傳遞通知字符串中的所有數據。

從JavaScript的角度來看,生成數據的JSON表示非常容易。但是,從C#端您必須聲明DataContractJsonSerializer需要解釋此數據的DataContract,這有點多。

JavaScript的輔助函數,它接受鍵/值對您的一維數組:

function saveUserSettings(valuesToSave) { 
    var notifyObject = { command: "saveUserSettings", values: valuesToSave }; 
    var notifyObjectString = JSON.stringify(notifyObject); 
    window.external.notify(notifyObjectString); 
} 

// call it like this... 
saveUserSettings([{ key: "key1", value: "value1" }, 
    { key: "key2", value: "value2" }]); 

C#合同:

using System.Runtime.Serialization; 

[DataContract] 
public class JsonScriptData 
{ 
    [DataMember(Name = "command")] 
    public string Command { get; set; } 

    [DataMember(Name = "values")] 
    public JsonUserSetting[] Values { get; set; } 
} 

[DataContract] 
public class JsonUserSetting 
{ 
    [DataMember(Name = "key")] 
    public string Key{ get; set; } 

    [DataMember(Name = "value")] 
    public object Value { get; set; } 
} 

和瀏覽器腳本通知變爲:

private void BrowserOnScriptNotify(object sender, NotifyEventArgs notifyEventArgs) 
    { 
     var str = notifyEventArgs.Value; 
     var serializer = new DataContractJsonSerializer(typeof(JsonScriptData)); 
     var bytes = Encoding.UTF8.GetBytes(str); 

     JsonScriptData commandData; 
     using (var memoryStream = new MemoryStream(bytes)) 
     { 
      commandData = (JsonScriptData)serializer.ReadObject(memoryStream); 
     } 

     // save out to application settings dictionary 
     var applicationSettings = IsolatedStorageSettings.ApplicationSettings; 
     foreach (var value in commandData.Values) 
     { 
      applicationSettings[value.Key] = value.Value; 
     } 
     applicationSettings.Save(); 
    } 

當然,您可以將整個用戶設置的JSON字符串從JS保存爲IsolatedStorageSettin這意味着C#甚至不需要解析它。

+0

感謝您提供非常明確的教育答案。我決定把c#端遺忘在一起,只是使用js的隔離存儲。 – Sopuli

0

Windows.Storage.ApplicationData.Current.RoamingSettingsnot supported在Windows Phone 8上,但在Windows Phone 8.1中受支持。相反,你可以使用隔離存儲。

您可以使用NuGet的Coding4Fun.Toolkit.Storage包,只需撥打Serialize.Save("PATH", objectToSave)即可保存一個項目,然後撥打var result = Serialize.Open<TypeOfObject>("PATH")以獲取數據。

NOTE:從該工具包的下一個版本開始,Serialize將爲Serializer。僅供參考。

+0

謝謝,我試了一下這個工具包,看看它是怎麼回事。真的很遺憾你無法漫遊設置。 – Sopuli

相關問題