Aracılığıyla paylaş


Web pencere öğesi sağlayıcıları

En son sürümde, Windows pencere öğelerini uygulayan uygulamalar pencere öğesi içeriğini uzak URL'den sunulan HTML ile doldurmayı seçebilir. Daha önce pencere öğesi içeriği yalnızca sağlayıcıdan Pencere Öğeleri Panosu'na geçirilen JSON yükünde Uyarlamalı Kart şema biçiminde sağlanabilirdi. Web pencere öğesi sağlayıcılarının hala Uyarlamalı Kart JSON yükü sağlaması gerektiğinden, bir C# Windows Uygulaması'nda pencere öğesi sağlayıcısı uygulaması için ve ya da bir C++/WinRT win32 uygulamasında pencere öğesi sağlayıcısı uygulaması içinve adımlarını izlemelisiniz.

İçerik URL'sini belirtme

Pencere öğesi sağlayıcıları, WidgetManager.UpdateWidgetçağrısıyla Pencere Öğeleri Panosu'na bir JSON yükü geçirir. Web pencere öğesi için, pencere öğesi içeriğini tanımlayan bir gövde nesnesi sağlamak yerine boş bir gövde nesnesi belirtmeniz ve bunun yerine, pencere öğesi için HTML içeriğini sağlayacak URL'yi işaret eden webUrl alanına sahip bir meta veri nesnesi eklemeniz gerekir.

{ 
    "type": "AdaptiveCard", 
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", 
    "version": "1.6", 
    "body": [], 
    "metadata": 
    { 
        "webUrl": "https://www.contoso.com/widgetprovider.html" 
    } 
} 

Kaynak isteklerini işleme

Pencere öğesi sağlayıcıları, sağlayıcının paket bildirim dosyasındaki Tanım öğesinde yer alan WebRequestFilter özniteliği aracılığıyla bir pencere öğesi için web isteği filtre dizesi belirtebilir. Pencere öğesi içeriği filtreyle eşleşen URI'ye göre bir kaynak istediğinde, istek durdurulur ve pencere öğesi sağlayıcısının IWidgetResourceProvider.OnResourceRequesteduygulamasına yönlendirilir.

Filtre düzeni, Eşleştirme Desenleriiçinde açıklanan biçim kullanılarak ifade edilir. Kayıttaki filtre dizesi, gerektiğinde Punycode kullanmalıdır. Tüm içerik türleri eşleştirildiğinde yeniden yönlendirilir, bu nedenle filtrenin yalnızca uygulamadaki IWidgetResourceProvider aracılığıyla elde edilmesi amaçlanan içeriğe çözümlenmesi gerekir. Pencere öğesi sağlayıcısı paket bildirim biçimi hakkında daha fazla bilgi için bkz. Pencere öğesi sağlayıcı paketi bildirim XML biçimi.

Kaynak isteklerini işlemek için pencere öğesi sağlayıcılarının IWidgetResourceProvider arabirimini uygulaması gerekir.

internal class WidgetProvider : IWidgetProvider, IWidgetResourceProvider

OnResourceRequested yönteminin uygulanmasında, pencere öğesi sağlayıcıları istenen kaynağı içeren bir WidgetResourceResponse nesnesine WidgetResourceRequestedArgs.Response özelliğini ayarlayarak istenen kaynakları sağlayabilir. Kaynağı zaman uyumsuz olarak alırken sağlayıcının WidgetResourceRequestedArgs.GetDeferral çağırarak erteleme istemesi ve ardından kaynak ayarlandığında ertelemeyi tamamlaması gerekir.

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

Sağlayıcı WidgetResourceRequestedArgs nesnesinde yönteme geçirilen bir yanıt ayarlamazsa sistem kaynağı web'den alır. Bu durumda sağlayıcı, kullanıcı bağlamı veya belirteçleri sağlamak gibi WidgetResourceRequestedArgs.Request nesnesinin Üst Bilgileri özelliğini değiştirmeyi seçebilir ve sistem, kaynağı web'den alırken güncelleştirilmiş üst bilgileri kullanır.

Web içeriğine gelen ve web içeriğinden gelen iletileri işleme

Pencere öğesi içeriğinden window.chrome.webview.postMessage JavaScript yöntemi kullanılarak gönderilen dize iletilerini almak için, pencere öğesi sağlayıcıları IWidgetProviderMessage arabirimini uygulayabilir ve OnMessageReceived yöntemini uygulayabilir.

internal class WidgetProvider : IWidgetProvider, IWidgetProviderMessage
...
public void OnMessageReceived(WidgetMessageReceivedArgs args)
{
    Console.WriteLine($"Message received from widget {args.WidgetContext.Id}: {args.Message}");
}

Pencere öğesi sağlayıcıları WidgetManager.SendMessageçağırarak pencere öğesinin web içeriğine bir ileti gönderebilir. Sağlayıcının paket bildirim dosyasındaki Tanım öğesinin Kimlik özniteliğinde belirtilen değer olan bir widget'a mesaj göndermek için, widget'ın kimliğini sağlamanız gerekir. Daha fazla bilgi için bkz. Widget sağlayıcı paketi XML manifest biçimi. İleti dizesi basit metin veya web içeriği tarafından yorumlanan bir nesnenin serileştirilmiş biçimi olabilir. Daha fazla bilgi için bkz. PostWebMessageAsString.

var message = $"{{ \"current_location\": \"{ location }\" }}";
WidgetManager.GetDefault().SendMessageToContent("Weather_Widget", message);

Sınırlamalar ve gereksinimler

  • Bu özellik yalnızca Avrupa Ekonomik Alanı'ndaki (EEA) kullanıcılar tarafından kullanılabilir. EEA'da, bir akış sağlayıcısı uygulayan yüklü uygulamalar, Pencere Öğeleri Panosu'nda içerik akışı sağlayabilir.