2

我正在使用 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# 传递参数吗?我可以将数组直接保存到 roamingSettings 中,还是需要将其砍掉并将所有内容分开保存?

为澄清起见,usersettings 数组是一维数组,我在其中推送带有“键”和“值”对的对象。因此,我可以使用 userSettings[i].key 和 .value 语法轻松访问循环内的内容。

4

2 回答 2

0

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

您可以使用 NuGet 中的Coding4Fun.Toolkit.Storage包,只需调用Serialize.Save("PATH", objectToSave)即可保存项目并var result = Serialize.Open<TypeOfObject>("PATH")取回数据。

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

于 2013-04-15T18:16:07.283 回答
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# 甚至不需要解析它。

于 2013-04-15T20:00:06.007 回答