我正在使用HTML5 / JavaScript为WP8开发应用程序。 我在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#吗? 我可以直接将数组保存到漫游设置中,还是需要将其删除并将所有内容分开保存?
为了澄清,usersettings数组是一维数组,我用“key”和“value”对推送对象。所以我可以轻松地使用循环访问内容 userSettings [i] .key和.value语法。
答案 0 :(得分:0)
Windows.Storage.ApplicationData.Current.RoamingSettings
not supported ,但在Windows Phone 8.1中受支持。相反,您可以使用隔离存储。
您可以使用NuGet中的Coding4Fun.Toolkit.Storage软件包,只需致电Serialize.Save("PATH", objectToSave)
保存项目,然后var result = Serialize.Open<TypeOfObject>("PATH")
即可恢复数据。
注意:从工具包的下一个版本开始,Serialize
将为Serializer
。只是一个FYI。
答案 1 :(得分: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();
}
当然,您可以将JS中的整个用户设置JSON字符串作为单个值保存到IsolatedStorageSettings中,这意味着C#甚至不需要解析它。