Windows Developer Day - Adaptive Cards

来源:https://www.cnblogs.com/shaomeng/archive/2018/03/13/8550751.html
-Advertisement-
Play Games

概述 Windows Developer Day 在 Modern Application Experience 環節展示了一種可以讓開發者以更通用和統一的方式來對卡片對展示和交互的方式,那就是:Adaptive Cards. 早在 Microsoft Build 2017,Matt Hidinge ...


概述

Windows Developer Day 在 Modern Application Experience 環節展示了一種可以讓開發者以更通用和統一的方式來對卡片對展示和交互的方式,那就是:Adaptive Cards.

早在 Microsoft Build 2017,Matt Hidinger 就對 Adaptive Cards 做了展示。

而在 WDD 前夕,Adaptive Cards 1.0 版本正式 Release,開源在 GitHub Microsoft AdaptiveCards官網文檔在 Microsoft Doc Adaptive Cards.

 

基本原理 

那麼 Adaptive Cards 是怎麼工作的呢?

  • 卡片的製作者使用 JSON 或 SDK 中類構建的方式來描述卡片內容,包括文本,按鈕,圖片,鏈接等;
  • 卡片內容在宿主程式中完成渲染,宿主程式樣式也是 JSON 或 SDK 類構建方式,樣式包括內容大小,顏色等的定義;
  • 因為卡片的內容準備和 UI 渲染都可以完全通過 JSON 方式定義,所以使用 Adaptive Cards 各平臺 SDK,就可以使用一套 JSON 完成多平臺的通用和統一;

這種實現方式和 Adaptive Cards 要實現的目標也是一致的:

The goals for adaptive cards are:

. Portable - To any app, device, and UI framework

. Open - Libraries and schema are open source and shared

. Low cost - Easy to define, easy to consume

. Expressive - Targeted at the long tail of content that developers want to produce

. Purely declarative - No code is needed or allowed

. Automatically styled - To the Host application UX and brand guidelines

 

開發體驗

多平臺 SDK 支持

因為 Adaptive Cards 是一種跨平臺方案,所以官方提供了 JavaScript,Android,iOS,UWP 和 .NET 五種常用的原生 SDK 來實現集成。

Install Adaptive Cards SDK

Platform Install Build Docs
 JavaScript npm v1.0.0 Source Docs
 .NET nuget v1.0.0 Source Docs
 .NET WPF nuget v1.0.0 Source Docs
 .NET HTML nuget v1.0.0 Source Docs
 Windows UWP nuget v1.0.0 Source Docs
 Android maven-central v1.0.0 Source Docs
 iOS pod v1.0.0 Source Docs

 

 

 

 

 

 

 

 

 

而目前  Adaptive Cards 支持的平臺:

  • 已經線上可用的:Bot Framework - WebChat,Cortana Skills,Windows Timeline
  • 還在預覽狀態的:Skype,Outlook,Microsoft Teams,Windows Notifications,Bot Framework - Other Channels

UWP 示例開發

1. 通過 Nuget 方式在 PM 中添加包:

Install-Package AdaptiveCards.Rendering.Uwp -Version 1.0.0

2. 實例化一個 Renderer,這個 Renderer 被用來渲染宿主配置信息和卡片內容:

using AdaptiveCards.Rendering.Uwp;
...
var renderer = new AdaptiveCardRenderer();

3. 為卡片設置宿主配置:

示例中我使用一個 ComboBox 來切換宿主配置,從不同的文本文件讀取對應的 JSON 字元串,反序列化為 HostConfig 並賦值給 Renderer。

string configJson = await getCardString(string.Format(@"Assets\{0}", (hostConfigBox.SelectedItem as ComboBoxItem).Content.ToString()));
var hostConfig = AdaptiveHostConfig.FromJsonString(configJson);
renderer.HostConfig = hostConfig.HostConfig;

4. 設置卡片內容:

示例中我從文本文件中讀取內容對應的 JSON 字元串,反序列化為 AdaptiveCard 類實例。

string cardJson = await getCardString(@"Assets\card.txt");
var card = AdaptiveCard.FromJsonString(cardJson).AdaptiveCard;
RenderedAdaptiveCard renderResult = renderer.RenderAdaptiveCard(card);

5. 在界面中顯示卡片:

把卡片內容顯示在界面的 Grid 中,每次顯示時,先清空前面的顯示內容。

if (renderResult.FrameworkElement != null)
{
    var uiCard = renderResult.FrameworkElement;
    uiCard.HorizontalAlignment = HorizontalAlignment.Left;
    cardGrid.Children.Clear();
    cardGrid.Children.Add(uiCard);
}

來看看運行的效果:

可以看到,使用同樣的卡片內容,在切換不同的宿主配置 Skype 和 Microsoft Teams 時,對應的卡片渲染後的 UI 是不同的,也是符合各自宿主 UI 風格的。

UWP SDK 的使用過程基本就是這樣,非常的簡單易上手。我們來看一下中間兩個重要的類:AdaptiveCard 和 AdaptiveHostConfig.

AdaptiveCard:

這個類里,我們看到了我們用到 FromJson 方法,以及一些主要屬性:Version(用於標識更新版本),Speak (表示卡片的朗讀內容),FallbackText(後備文本),BackgroundImage(卡片背景圖片),Actions(按鈕的操作集合)等。

#region 程式集 AdaptiveCards.Rendering.Uwp, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime
// C:\Users\123\.nuget\packages\AdaptiveCards.Rendering.Uwp\1.0.0\lib\uap10.0\AdaptiveCards.Rendering.Uwp.winmd
#endregion

using System;
using System.Collections.Generic;
using Windows.Data.Json;
using Windows.Foundation.Metadata;

namespace AdaptiveCards.Rendering.Uwp
{
    [Activatable(167772162)]
    [Static(typeof(IAdaptiveCardStatics), 167772162)]
    [Version(167772162)]
    public sealed class AdaptiveCard : IAdaptiveCard
    {
        public AdaptiveCard();

        public JsonObject ToJson();
        [Overload("FromJson")]
        public static AdaptiveCardParseResult FromJson(JsonObject adaptiveJson);
        [Overload("FromJsonWithParserRegistration")]
        public static AdaptiveCardParseResult FromJson(JsonObject adaptiveJson, AdaptiveElementParserRegistration elementRegistration, AdaptiveActionParserRegistration actionRegistration);
        [Overload("FromJsonString")]
        public static AdaptiveCardParseResult FromJsonString(string adaptiveJson);
        [Overload("FromJsonStringWithParserRegistration")]
        public static AdaptiveCardParseResult FromJsonString(string adaptiveJson, AdaptiveElementParserRegistration elementRegistration, AdaptiveActionParserRegistration actionRegistration);

        public string Version { get; set; }
        public ContainerStyle Style { get; set; }
        public string Speak { get; set; }
        public string FallbackText { get; set; }
        public Uri BackgroundImage { get; set; }
        public IList<IAdaptiveActionElement> Actions { get; }
        public IList<IAdaptiveCardElement> Body { get; }
        public ElementType ElementType { get; }
    }
}

而針對 AdaptiveCard 的格式, 完整的說明文檔可以在官方文檔的 Card Schema 中看到:https://docs.microsoft.com/zh-cn/adaptive-cards/create/cardschema

對應上面的示例,我們使用的 JSON 文件大致組成如下:

 

AdaptiveHostConfig:

這裡類里,我們看到了我們用到的 FromJson 方法,以及設置宿主樣式的配置信息,如字體,文字大小,按鈕操作,文字間距等樣式配置。大家也可以再去具體看每個配置都有哪些枚舉值可用。

#region 程式集 AdaptiveCards.Rendering.Uwp, Version=255.255.255.255, Culture=neutral, PublicKeyToken=null, ContentType=WindowsRuntime
// C:\Users\123\.nuget\packages\AdaptiveCards.Rendering.Uwp\1.0.0\lib\uap10.0\AdaptiveCards.Rendering.Uwp.winmd
#endregion

using Windows.Data.Json;
using Windows.Foundation.Metadata;

namespace AdaptiveCards.Rendering.Uwp
{
    [Activatable(167772162)]
    [Static(typeof(IAdaptiveHostConfigStatics), 167772162)]
    [Version(167772162)]
    public sealed class AdaptiveHostConfig : IAdaptiveHostConfig
    {
        public AdaptiveHostConfig();

        public static AdaptiveHostConfigParseResult FromJsonString(string hostConfigJson);
        public static AdaptiveHostConfigParseResult FromJson(JsonObject hostConfigJson);

        public bool SupportsInteractivity { get; set; }
        public AdaptiveSpacingConfig Spacing { get; set; }
        public AdaptiveSeparatorConfig Separator { get; set; }
        public AdaptiveImageSizesConfig ImageSizes { get; set; }
        public AdaptiveImageSetConfig ImageSet { get; set; }
        public AdaptiveImageConfig Image { get; set; }
        public AdaptiveFontWeightsConfig FontWeights { get; set; }
        public AdaptiveFontSizesConfig FontSizes { get; set; }
        public string FontFamily { get; set; }
        public AdaptiveFactSetConfig FactSet { get; set; }
        public AdaptiveContainerStylesDefinition ContainerStyles { get; set; }
        public AdaptiveCardConfig AdaptiveCard { get; set; }
        public AdaptiveActionsConfig Actions { get; set; }
    }
}

而針對 AdaptiveHostConfig 的欄位, 完整的說明文檔可以在官方文檔的 Card Schema 中看到:https://docs.microsoft.com/zh-cn/adaptive-cards/display/hostconfig

對應上面的示例,我們使用的 JSON 文件大致組成如下:

 

 

如果大家想簡單體驗一下 AdaptiveCard 和 AdaptiveHostConfig 的變化對卡片的影響,不想自己寫 Demo,也可以通過它提供的線上體驗的方式:http://adaptivecards.io/visualizer/index.html?hostApp=Bot%20Framework%20WebChat

通過這個線上編輯器,可以很直觀的看到每個欄位的修改對卡片的影響。

 

對 Adaptive Cards 的簡單體驗和示例就到這裡,後面如果產品代碼中實際用到,我會再結合實際場景來具體展開分析,謝謝大家! 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 定時運行任務對於一個網站來說,是一個比較重要的任務,比如定時發佈文檔,定時清理垃圾信息等,現在的網站大多數都是採用PHP動態語言開發的,而對於PHP的實現決定了它沒有Java和.Net這種AppServer的概念,而http協議是一個無狀態的協議,PHP只能被用戶觸發,被調用,調用後會自動退出記憶體, ...
  • 題目描述 火星探險隊的登陸艙將在火星錶面著陸,登陸艙內有多部障礙物探測車。登陸艙著陸後,探測車將離開登陸艙向先期到達的傳送器方向移動。探測車在移動中還必須採集岩石標本。每一塊岩石標本由最先遇到它的探測車完成採集。每塊岩石標本只能被採集一次。岩石標本被採集後,其他探測車可以從原來岩石標本所在處通過。探 ...
  • 首先本人學習變編程有半年了吧,現在是大四準畢業生,今年六月份畢業,專業是機電類的,與IT行業幾乎不相關,所以我是零基礎學習編程的。 看視頻學習 我接觸python編程是看書本自己理解然後自己跟著書本寫代碼,學了一段時間後朋友介紹說上網搜培訓視頻更容易學,於是我去找了一套視頻自己慢慢看慢慢學。接觸視頻 ...
  • 簡單讀取 json 配置文件 背景 目前發現網上的 .NET Core 讀取配置文件有點麻煩,自己想搞個簡單點的。 .NET Core 已經不使用之前的諸如 app.config 和 web.config 等 xml 形式的配置文件,一致採用 json 格式來存儲配置文件信息。 json 文件 de ...
  • 在WPF自學入門(二)WPF-XAML佈局控制項的文章中分別介紹StackPanel,WarpPanel,DockPanel,Grid,Canvas五種佈局容器的使用,可以讓我們大致瞭解容器可以使用在什麼地方。今天我們就來簡單瞭解一下WPF中的三個帶標題的內容控制項,分別是GroupBox,TabCon ...
  • 學了那麼久的函數式編程語言,一直想寫一些相關的文章。經過一段時間的考慮,我決定開這個坑。 至於為什麼選擇C#,在我看來,編程語言分三類:一類是難以進行函數式編程的語言,這類語言包括Java6、C語言等。這類語言由於不支持匿名函數等特性,進行函數式編程會比較困難;一類是自稱“函數式編程語言”的語言,包 ...
  • C#中的DateTime在邏輯上有個非常嚴重的缺陷: 在C#交互模式中輸入以上代碼,可以發現儘管一個是本地時間(d),一個是UTC時間(d2),只是時區不一樣,但在這個世界上,應該屬於同一個時刻。然而兩個時間卻不相等。。。 原因在於DateTime不存儲時區,或者說,只存儲了一個模糊的關於時區的欄位 ...
  • C#淺解眾所周知c#是微軟推出的一款完全沒面向對象的編程語言,那麼對象是什麼?在現實生活中人們一提到對象首先想到的就是“情侶”!但是在我們的程式中對象是什麼? 在程式中個能夠區別於其他事物的獨立個體我們稱它為對象他是類的一個實例。那麼現在問題來了 ,你說對象是類的實例。那類又是什麼?好 在程式中類是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...