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

时间:2013-04-15 18:06:35

标签: javascript windows-phone-8

我正在使用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语法。

2 个答案:

答案 0 :(得分:0)

Windows Phone 8上的

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