Windows phone 8中的应用程序设置,使用javascript

Windows phone 8中的应用程序设置,使用javascript,javascript,windows-phone-8,Javascript,Windows Phone 8,我正在使用HTML5/JavaScript为WP8开发一个应用程序。 我在JavaScript的数组变量中收集用户设置,非常希望保存这些设置以备将来使用。并将其保存在漫游设置中,以便更精确 经过一些研究,这似乎是不可能的直接从js。我在Windows 8中找到的用于执行此任务的API调用在WP8下不起作用。所以我能想到的唯一解决办法是结构: 1) 当我想保存数据时,我会从js window.external.notify("LaunchSaveProcess"); 向浏览器发送通知 2) 在

我正在使用HTML5/JavaScript为WP8开发一个应用程序。 我在JavaScript的数组变量中收集用户设置,非常希望保存这些设置以备将来使用。并将其保存在漫游设置中,以便更精确

经过一些研究,这似乎是不可能的直接从js。我在Windows 8中找到的用于执行此任务的API调用在WP8下不起作用。所以我能想到的唯一解决办法是结构:

1) 当我想保存数据时,我会从js

window.external.notify("LaunchSaveProcess"); 
向浏览器发送通知

2) 在XAML文件中

<phone:WebBrowser ScriptNotify="Catch_Script_Notification" /> 
4) “重要函数”调用JavaScript中的一个方法,该方法返回用户设置数组,然后使用

var userSettings = Browser.InvokeScript("getSettings()");
var roamingSettings = Windows.Storage.ApplicationData.Current.RoamingSettings;
roamingSettings.Values["settings"] = userSettings;
现在有几个问题。 这个模型是对的,还是有更简单的方法?在发出通知事件时,您能否以某种方式将参数直接从JavaScript传递到c#? 我可以直接将数组保存到roamingSettings中,还是需要将其切碎并单独保存

为了澄清,usersettings数组是一维数组,在这里我推送带有“键”和“值”对的对象。因此,我可以使用
userSettings[i].键和.value语法。

Windows.Storage.ApplicationData.Current.RoamingSettings
在Windows Phone 8上是,但在Windows Phone 8.1中受支持。相反,您可以只使用隔离存储

您可以使用NuGet中的包,只需调用
Serialize.Save(“PATH”,objectToSave)
保存一个项目,然后调用
var result=Serialize.Open(“PATH”)
返回数据


注意:从工具包的下一个版本开始,
Serialize
将成为
Serializer
。仅供参考。

从C#调用JavaScript的另一种替代方法是一次性传递通知字符串中的所有数据

在JavaScript方面,生成数据的JSON表示非常容易。然而,从C#端,您必须声明DataContract,即
DataContractJsonSerializer
需要解释此数据,这需要更多的工作

JavaScript助手函数,它接受键/值对的1D数组:

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#甚至不需要解析它。

谢谢,我尝试一下该工具包,看看它是如何运行的。真遗憾你不能在这些环境中漫游。谢谢你给出了非常清晰和有教育意义的答案。我决定把c#side忘在一起,只使用js中的独立存储。
    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();
    }