簡體   English   中英

使用javascript在Windows Phone 8中進行應用程序設置

[英]Application settings in Windows phone 8, using javascript

我正在使用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語法輕松訪問循環內的內容。

Windows Phone 8 不支持 Windows.Storage.ApplicationData.Current.RoamingSettings ,但Windows Phone 8.1支持Windows.Storage.ApplicationData.Current.RoamingSettings 相反,您可以只使用隔離存儲。

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

注意:從工具包的下一個版本開始, Serialize將是Serializer 僅供參考。

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

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

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; }
}

並且您的瀏覽器腳本notify變為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM