WPF開發Surface Dial執行個體教程

來源:互聯網
上載者:User
前段時間巨硬發布了一款新的輸入裝置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大家自己研究下,也希望大家留言評論解答我的疑惑

連結: 密碼: h722



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.