WPF 開發的實用小工具(附源碼)持續更新(七)根據應用首個字的首字母按鍵定位

接着上一篇  

 點擊鏈接加入羣聊

 在使用過程中當應用太多很難快速的找到並定位到自己所需要使用的應用,所以此次做了更新方便快速查找應用。

【update】
1、輸入應用首字的首字母定位。

 

鍵盤按下 KeyDown 

定義ScrollViewer 所需要滾動值 double offset = 0.0;。

定義 bool isFind = false; 如果爲 True 找到就不查找控件。

1、通過FindChild查找ScrollViewer方便最後定位使用。

ScrollViewer scrollViewer = ControlsHelper.FindChild<ScrollViewer>(this.AppSwitchList, "PART_ScrollViewer");

2、通過FindVisualChildren查找我所定義DataTemplate下的Border。

var elementList = ControlsHelper.FindVisualChildren<Border>(this.AppSwitchList).ToList();

3、循環 elementList 集合,判斷 Tag 不等於 null 時對 offset += element.ActualHeight ,並且相等於按下鍵盤的Key值。

if (element.Tag != null && element.Tag.ToString().Equals(_key))
4、定位到找到的第一個與Key相等的。

scrollViewer.ScrollToVerticalOffset(offset);

var _key = Win32Api.GetCharFromKey(e.Key).ToString().ToUpper();
            if (string.IsNullOrWhiteSpace(_key))
                return;
            double offset = 0.0;
            ScrollViewer scrollViewer = ControlsHelper.FindChild<ScrollViewer>(this.AppSwitchList, "PART_ScrollViewer");
            var elementList = ControlsHelper.FindVisualChildren<Border>(this.AppSwitchList).ToList();
            bool isFind = false;
            for (int i = 0; i < elementList.Count; i++)
            {
                var element = elementList[i];
                if (isFind) break;
                if (element.Tag != null)
                {
                    offset += element.ActualHeight;
                    if (element.Tag.ToString().Equals(_key))
                    {
                        offset -= element.ActualHeight;
                        scrollViewer.ScrollToVerticalOffset(offset);
                        isFind = true;
                    }
                }

            }
            this.KeyDownText.Text = _key;
            this.KeyDownPanel.Visibility = Visibility.Visible;
View Code

獲取按鍵轉譯

public enum MapType : uint
        {
            MAPVK_VK_TO_VSC = 0x0,
            MAPVK_VSC_TO_VK = 0x1,
            MAPVK_VK_TO_CHAR = 0x2,
            MAPVK_VSC_TO_VK_EX = 0x3,
        }

        [DllImport("user32.dll")]
        public static extern int ToUnicode(
            uint wVirtKey,
            uint wScanCode,
            byte[] lpKeyState,
            [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)]
            StringBuilder pwszBuff,
            int cchBuff,
            uint wFlags);

        [DllImport("user32.dll")]
        public static extern bool GetKeyboardState(byte[] lpKeyState);

        [DllImport("user32.dll")]
        public static extern uint MapVirtualKey(uint uCode, MapType uMapType);

        public static char GetCharFromKey(Key key)
        {
            char ch = ' ';

            int virtualKey = KeyInterop.VirtualKeyFromKey(key);
            byte[] keyboardState = new byte[256];
            GetKeyboardState(keyboardState);

            uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
            StringBuilder stringBuilder = new StringBuilder(2);

            int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
            switch (result)
            {
                case -1:
                    break;
                case 0:
                    break;
                case 1:
                    {
                        ch = stringBuilder[0];
                        break;
                    }
                default:
                    {
                        ch = stringBuilder[0];
                        break;
                    }
            }
            return ch;
        }
View Code

 擡起後隱藏

  Thread.Sleep(300);
            this.KeyDownPanel.Visibility = Visibility.Collapsed;
View Code

 

 效果圖

 

 源碼下載地址

 gitee

下載解壓後體驗

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章