[英]Dynamically injecting javascript in windows phone 8 application
[英]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.