UwpDesktop!WPF也能開發Surface Dial

来源:http://www.cnblogs.com/StartAllOverAgain/archive/2017/06/12/6992398.html
-Advertisement-
Play Games

前段時間巨硬發佈了一款新的輸入設備Surface Dial,配合Surface Studio使用簡直炫酷到沒朋友。 本人由於公司業務有幸參與了微軟的相關培訓,最大的收穫覺得是發現WPF居然也可以開發Dial, WPF居然可以使用UWP的API! 不賣關子,關鍵就是名為“UwpDesktop”的一個N ...


前段時間巨硬發佈了一款新的輸入設備Surface Dial,配合Surface Studio使用簡直炫酷到沒朋友。

本人由於公司業務有幸參與了微軟的相關培訓,最大的收穫覺得是發現WPF居然也可以開發Dial, WPF居然可以使用UWP的API!

不賣關子,關鍵就是名為“UwpDesktop”的一個Nuget,在我們的WPF程式中添加這個nuget就可以了。上一篇文章中寫的WPF起調UWP也藉助了這個nuget。

由於我們的現有解決方案是拿wpf做的,所以培新間歇我直奔主題,就問老外這個東西滋不滋磁WPF,得到的答案是肯定的。那怎麼用呢,有沒有demo呢,還真有,那再麻煩您拷給我吧,,,於是有了下麵的demo

我還是直接貼代碼吧,

public MainWindow()
        {
            InitializeComponent();

            //SetRadialControllerConfiguration();
            
            var interop = (IRadialControllerInterop)System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeMarshal
                .GetActivationFactory(typeof(RadialController));

            Guid guid = typeof(RadialController).GetInterface("IRadialController").GUID;

            Window window = Window.GetWindow(this);
            var wih = new WindowInteropHelper(window);
            IntPtr hWnd = wih.Handle;

            // Create a reference to the RadialController.
            radialController = interop.CreateForWindow(hWnd, ref guid);

            string iconFileName = "Assets\\dial_icon_custom_item.png";
            string filePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, iconFileName);
            var getItemImageOperation = StorageFile.GetFileFromPathAsync(filePath);
            getItemImageOperation.Completed += new AsyncOperationCompletedHandler<StorageFile>(AddMenuItemFromImage);


            // Declare input handlers for the RadialController.
            radialController.RotationChanged += RadialController_RotationChanged; ;
        }

還有個很關鍵的類RadialControllerInterfaces.cs

  [System.Runtime.InteropServices.Guid("787cdaac-3186-476d-87e4-b9374a7b9970")]
    [System.Runtime.InteropServices.InterfaceType(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIInspectable)]
    interface IRadialControllerConfigurationInterop
    {
        RadialControllerConfiguration GetForWindow(IntPtr hwnd, [System.Runtime.InteropServices.In]ref Guid riid);
    }

    [System.Runtime.InteropServices.Guid("1B0535C9-57AD-45C1-9D79-AD5C34360513")]
    [System.Runtime.InteropServices.InterfaceType(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIInspectable)]
    interface IRadialControllerInterop
    {
        RadialController CreateForWindow(IntPtr hwnd, [System.Runtime.InteropServices.In]ref Guid riid);
    }

這個類提供了CreateForWindow方法可以讓我們創建RadialController對象,個人覺得這個介面很玄乎,上邊的Guid特性(這個是叫特性吧?)是寫死的,問了工程師說這個不用改,這不就很坑了,如果不是有個demo,我怎麼知道怎麼寫,,,

作為弱雞,這裡我也有問題請教大家:

1.這些特性的作用,平時自己寫代碼貌似只用過【datacontract】

 
[System.Runtime.InteropServices.Guid("1B0535C9-57AD-45C1-9D79-AD5C34360513")]
[System.Runtime.InteropServices.InterfaceType(System.Runtime.InteropServices.ComInterfaceType.InterfaceIsIInspectable)]    

2.MainWindow中代碼

var interop = (IRadialControllerInterop)System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeMarshal
                .GetActivationFactory(typeof(RadialController));

總覺得閱讀性這麼差呢,看不懂,或許是我從未見過,對這個方法不熟?

 

微軟工程師給我的這個Demo我發現有兩個Bug(他本人也表示還沒寫完,是Dirty Demo),一個是SetRadialControllerConfiguration這個方法里異常,不能用,導致不能初始化Dial的菜單,每次啟動應用都會往菜單里

添加一項;另一個是焦點問題,當長按dial選擇了其他菜單,例如音量,再返回我們的demo,發現此時dial仍然控制的是音量

由於本人太弱,就不多說了,末尾附上Dr.Neil的demo大家自己研究下,也希望大家留言評論解答我的疑惑

鏈接: http://pan.baidu.com/s/1boJrIbH 密碼: h722




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

-Advertisement-
Play Games
更多相關文章
  • 反射是.net中非常有用的特性。 什麼是反射 可以用一句話來概括就是:基於程式集和元數據,可以動態創建某個類型的實例,調用方法,和訪問對象成員的一種能力。 為什麼要使用反射 在編譯時無法確定要調用的對象的時候,就不得不使用反射。 反射的應用場景 最常見的應用場景有: 1,ORM框架,因為它要面對的是 ...
  • 下載Redis https://github.com/MSOpenTech/redis 修改Redis.windows.conf,如果不修改,遠程不能訪問Redis 將bind 127.0.0.1 改成了bind 0.0.0.0。註意:進入生產環境時候,要啟用密碼,否則會是Redis漏洞. prot... ...
  • 文檔: "http://structuremap.github.io/documentation/" 下載: "https://sourceforge.net/projects/structuremap/" GitHub: "https://github.com/structuremap/struc ...
  • 1,值類型對象有兩種表示形式:未裝箱和已裝箱,相反引用類型總是處於已裝箱形式 2,值類型從System.ValueType派生。該類型提供了與System.Object相同的方法。但是System.ValueType重寫了Equals方法,能在兩個對象的欄位值完全匹配的前提下返回true。此外,Sy ...
  • 代碼格式化:Ctrl K +Ctrl D ...
  • 寫在前面整個項目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp善用 Ctrl + F 查找題目。本節你可能會需要的兩個測試數據文件:largeW: http://algs4.cs.princeto... ...
  • ServerSuperIO以前所做的工作逐步為形成迴路控制或級聯控制打下基礎,例如:服務連接器和設備驅動連接器的開發與應用。總之,是通過多種形式下發命令控制設備(驅動)或感測器,雲端控制站點或監測點的感測器、App或者其他終端控制感測器、根據感測器的採集數據控制另一個感測器等。 ...
  • 現在辦公要流程化,營銷也有流程,流程現在已經是各種生活活動不可缺少的一部分了。就像這句耳熟能詳的話:“凡事,我們先走個流程嘛!”,在信息化、流程化的背景下。工作流引擎,這個名詞就出現了!那麼,什麼是工作流引擎呢?所謂工作流引擎是指workflow作為應用系統的一部分,併為之提供對各應用系統有決定作用 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...