【Windows 10 應用開發】自定義快捷鍵

上一篇鳥文中,老周經過前所未有的代碼向各位 demo 了訪問鍵的用法(即 Alt + 某某)。不過,大夥伴們必定會發現,訪問鍵畢竟限制較大,不太靈活,也很差發揮,因而就須要自定義快捷鍵了。編程

其實,自定義快捷鍵也不是什麼很玄的東西,老周向來不喜歡故弄玄虛,說白了嘛,就是對鍵盤事件的處理。UWP 與 WPF 有類似處,但也有差別。這些差別是不影響我們編程的,要是有些差別你就以爲有困難了,那證實你的編程水平實在太差,趕忙回家給黨組織寫 10 份 800000 字的反省。ide

既然是鍵盤事件了,你首先閉上眼睛,一邊養神一邊想一想,鍵盤事件會涉及到什麼關聯的數據呢。首先,程序必須知道哪一個鍵被操做了,是吧,而每一個鍵都有內置的碼位的,如虛鍵碼,這個好辦,Windows.System.VirtualKey 枚舉已經爲咱們定義好了,因此這個你沒必要煩心;接着,咱們會想到,一個鍵會有啥操做呢?是了,無非就是按下和鬆開,即 Key Down和Key Up。spa

只要以上問題你想通了,那事情就很好弄了,比吃栗子還簡單。code

 

UWP的SDK 給咱們準備了兩個鍵盤事件:KeyDown在鍵被按下時發生,KeyUp在鍵彈起時發生。至於要處理哪一個事件,或者是否兩個都處理,那就看你要作什麼了。orm

要注意,這兩個鍵盤事件出如今兩個地方:對象

一、UIElement 類公開了這兩個事件,這是用於處理用戶界面上的元素的鍵盤行爲的,但不包括當前窗口。blog

二、要在當前窗口層面上處理鍵盤事件,就要用到 CoreWindow 類,該類也公開這兩個鍵盤事件。調用 GetForCurrentThread 靜態方法,能夠獲取到當前窗口的實例。事件

 

Part 1 :簡單按鍵處理

所謂簡單按鍵,就是隻按一個鍵的快捷鍵。這裏我用一例子來演示。圖片

界面上有一個 ListView 控件,裏面有四個選項,XAML 以下。ip

        <ListView Name="lv" Margin="13">
            <ListViewItem>飛機</ListViewItem>
            <ListViewItem>火車</ListViewItem>
            <ListViewItem>自行車</ListViewItem>
            <ListViewItem>公交車</ListViewItem>
        </ListView>

隨後,我們實現的功能,用F一、F二、F3 和 F4 四個鍵分別表明選中上面列表控件中的項。如F1選中第一項,F2選中第二項等。

此處,老周選用 CoreWindow 類,即該快捷鍵是能夠在當前窗口範圍內捕捉的。

        CoreWindow coreWind = null;
        ……
        coreWind = CoreWindow.GetForCurrentThread();
         coreWind.KeyDown += OnWindowKeyDown;

        ……
        private void OnWindowKeyDown(CoreWindow sender, KeyEventArgs args)
        {
            switch (args.VirtualKey)
            {
                case Windows.System.VirtualKey.F1:
                    lv.SelectedIndex = 0;
                    break;
                case Windows.System.VirtualKey.F2:
                    lv.SelectedIndex = 1;
                    break;
                case Windows.System.VirtualKey.F3:
                    lv.SelectedIndex = 2;
                    break;
                case Windows.System.VirtualKey.F4:
                    lv.SelectedIndex = 3;
                    break;
            }
        }

上面代碼很好懂,此處就不解釋了,節省600個字。

 

Part 2 :複合快捷鍵處理

所謂複合快捷鍵,就是同時按下兩個或兩個以上的鍵,我們少說P話,仍是經過實例來講明吧。這個例子是這樣的:在頁面上使用 Image 控件顯示一張圖片,而後,按下【 Ctrl + 加號】來放大圖像,按【Ctrl + 減號】來縮小圖像。

其中主要的 XAML 以下。

        <Image Source="Assets\1.jpg" Margin="6" RenderTransformOrigin="0.5,0.5" >
            <Image.RenderTransform>
                <ScaleTransform x:Name="scl" ScaleX="1.0" ScaleY="1.0"/>
            </Image.RenderTransform>
        </Image>

因爲 Image 控件不能接收鍵盤輸入焦點,元素KeyDown和KeyUp事件不能響應,仍是考慮用CoreWindow類上的事件。

        CoreWindow coreWind = null;
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            coreWind = CoreWindow.GetForCurrentThread();
            coreWind.KeyDown += OnKeydown;
            coreWind.KeyUp += OnKeyup;
        }

這裏要特特意聲明一個bool類型的變量,用來表示Ctrl鍵是否按下。

bool Ctrl_down = false;

若是你不想用變量來標誌Ctrl鍵是否按下,也能夠訪問 CoreWindow 對象的 GetKeyState(Windows.System.VirtualKey) 方法,來檢查一下Ctrl 鍵是否已經按下。不過,老周認這仍是直接聲明一個變量來保存按鍵狀態更簡單。

在KeyUp事件處理中,若是Ctrl鍵彈起,就讓Ctrl_down變量改成 false。

        private void OnKeyup(CoreWindow sender, KeyEventArgs e)
        {
            if (e.VirtualKey == VirtualKey.Control)
            {
                Ctrl_down = false;
            }
        }

在 KeyDown 事件中,分兩種情形:a、若是按下的是Ctrl鍵,就把變量Ctrl_down變量改成 true;b、若是Ctrl鍵已按下,而且還按了其餘鍵,就要判斷一下,是否是按了加號鍵或減號鍵。加號鍵就放大圖像,減號鍵就縮小圖像。

        private void OnKeydown(CoreWindow sender, KeyEventArgs e)
        {
            if (e.VirtualKey == VirtualKey.Control)
            {
                Ctrl_down = true;
                return;
            }

            // 進行縮放處理
            if (Ctrl_down)
            {
                switch (e.VirtualKey)
                {
                    case VirtualKey.Add:
                        if (scl.ScaleX < 5.0) scl.ScaleX += 0.2;
                        if (scl.ScaleY < 5.0) scl.ScaleY += 0.2;
                        break;
                    case VirtualKey.Subtract:
                        if (scl.ScaleX > 0.3) scl.ScaleX -= 0.2;
                        if (scl.ScaleY > 0.3) scl.ScaleY -= 0.2;
                        break;
                }
            }
        }

如今運行示例,而後本身按【Ctrl + (+)】和【Ctrl + (-)】鍵試試。

 

請各位嚴重注意一下:Key 事件並不記錄 Alt 鍵,該鍵在 VirtualKey 枚舉中用 Menu 表示,這傢伙比較另類。它能夠從表示按鍵狀態的 CorePhysicalKeyStatus 結構的 IsMenuKeyDown 字段獲取。

 

本文兩個示例源代碼的下載地址

相關文章
相關標籤/搜索