在最新版本中,實作 Windows 小工具的應用程式可以選擇使用從遠端 URL 提供的 HTML 來填入 Widget 內容。 先前,Widget 的內容只能以 Adaptive Card 架構格式,在從提供者傳遞至 Widgets Board 的 JSON 承載中提供。 因為 Web widget 提供者仍然必須提供 Adaptive Card JSON 承載,因此您應該遵循在 C# Windows 應用程式中實作 widget 提供者 或在 win32 應用程式中實作 widget 提供者(C++/WinRT) 的步驟。
指定內容 URL
Widget 提供者會將 JSON 承載傳遞至 Widgets 面板,並呼叫 WidgetManager.UpdateWidget。 對於 Web 小工具,您不應該提供定義小工具內容的 body 物件,而應該指定一個空的 body 物件,並且包含一個metadata 物件,該物件中有一個 webUrl 欄位指向提供小工具 HTML 內容的 URL。
{
"type": "AdaptiveCard",
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.6",
"body": [],
"metadata":
{
"webUrl": "https://www.contoso.com/widgetprovider.html"
}
}
處理資源要求
Widget 提供者可以在提供者的套件清單檔案中,於 Definition 元素的 WebRequestFilter 屬性裡指定 widget 的 Web 請求篩選字串。 每當小工具內容依符合篩選條件的 URI 要求資源時,就會攔截要求並重新導向至小工具提供者的 IWidgetResourceProvider.OnResourceRequested 實作。
篩選模式是使用 比對模式中所述的格式來表示。 註冊中的篩選字串必須在必要時使用 Punycode 。 比對後,所有內容類型都會被重新導向,因此篩選器應該僅解析為透過應用程式中的 IWidgetResourceProvider 取得的內容。 如需小工具提供者套件指令清單格式的詳細資訊,請參閱 Widget 提供者套件指令清單 XML 格式。
若要處理資源要求,小工具提供者必須實作 IWidgetResourceProvider 介面。
internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider
在 OnResourceRequested 方法的實作中,小工具提供者可以將 WidgetResourceRequestedArgs.Response 屬性設定為包含所要求資源的 WidgetResourceResponse 物件,以提供要求的資源。 以異步方式取得資源時,提供者應該呼叫 WidgetResourceRequestedArgs.GetDeferral 來要求延遲,然後在設定資源時完成延遲。
async void IWidgetResourceProvider.OnResourceRequested(WidgetResourceRequestedArgs args)
{
var deferral = args.GetDeferral();
if (args.Request.Uri.Length > 0)
{
if (args.Request.Uri == "https://contoso.com/logo-image")
{
string fullPath = Windows.ApplicationModel.Package.Current.InstalledPath + "/Assets/image.png";
var file = await StorageFile.GetFileFromPathAsync(fullPath);
var response = new WidgetResourceResponse(RandomAccessStreamReference.CreateFromFile(file), "OK", 200);
response.Headers.Add("Content-Type", "image/png");
args.Response = response;
}
}
deferral.Complete();
}
如果提供者未在傳遞至 方法的 WidgetResourceRequestedArgs 物件上設定回應,系統會從 Web 擷取資源。 在此情況下,提供者可以選擇修改 WidgetResourceRequestedArgs.Request 物件的 Headers 屬性,例如提供用戶內容或令牌,而系統會在從 Web 擷取資源時使用更新的標頭。
處理來自 Web 內容的訊息
若要從 Widget 內容接收已使用 window.chrome.webview.postMessage JavaScript 方法張貼的字元串訊息,小工具提供者可以實作 IWidgetProviderMessage 介面,並實作 OnMessageReceived 方法。
internal class WidgetProvider : IWidgetProvider, IWidgetProviderMessage
...
public void OnMessageReceived(WidgetMessageReceivedArgs args)
{
Console.WriteLine($"Message received from widget {args.WidgetContext.Id}: {args.Message}");
}
Widget 提供者可以透過呼叫 WidgetManager.SendMessage,將訊息傳送至小工具的網頁內容。 您必須提供接收訊息的小工具的 ID,這是提供者套件指令清單檔案中 Definition 元素的 Id 屬性中指定的值。 如需詳細資訊,請參閱 Widget 提供者套件指令清單 XML 格式。 訊息字串可以是簡單的文字或 Web 內容所解譯之物件的串行化形式。 如需詳細資訊,請參閱 PostWebMessageAsString。
var message = $"{{ \"current_location\": \"{ location }\" }}";
WidgetManager.GetDefault().SendMessageToContent("Weather_Widget", message);
限制和需求
- 這項功能僅適用於歐洲經濟區 (EEA) 的使用者。 在歐洲經濟區,實作摘要提供者的已安裝應用程式可以在小工具板中提供內容摘要。