<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一個(gè)WPF下的虛擬鍵盤(pán)實(shí)現(xiàn)

      給上位機(jī)觸摸屏做一個(gè)虛擬鍵盤(pán),這玩意兒不就是一排的網(wǎng)格里面放滿button嘛 。說(shuō)歸這樣說(shuō) 依然還是有一堆細(xì)節(jié)需要你去處理的。不論如何 先畫(huà)個(gè)鍵盤(pán)吧。

       

      簡(jiǎn)單的從網(wǎng)上找個(gè)鍵盤(pán)位圖做參照使用 4行Grid 布局一下 是不是有模有樣。主要是按鍵的樣式要想好看的話的花一些功夫。然后所有的button需要綁定同一個(gè)事件,由于WPF里的事件是路由事件 我們直接在最外面的Grid上寫(xiě) ButtonBase.Click="ButtonGrid_Click" 即可 ,以前竟然沒(méi)發(fā)現(xiàn)還可以這樣ButtonBase 了解了。然后有幾個(gè)藍(lán)色的Fun按鍵需要做特殊處理和定義, 還有就算我們做成的userControl控件,需要把事件暴露給外部 讓按特定鍵的時(shí)候外部寫(xiě)自己的處理邏輯。

      按鍵和事件定義

       1 public Action<object> MyKeyDown;
       2 private String valueString;
       3 
       4 internal String ValueString
       5 {
       6     get { return valueString; }
       7 }
       8 public enum EKeyitem
       9 {
      10     DEl,
      11     AC,
      12     OK,
      13     Shift,
      14     A
      15 }

      事件觸發(fā)

       1 private void ButtonGrid_Click(object sender, RoutedEventArgs e)
       2 {
       3     Button clickedButton = (Button)e.OriginalSource;    //獲取click事件觸發(fā)源,即按了的按鈕
       4     if ((String)clickedButton.Content == "DEL")
       5     {
       6         MyKeyDown(EKeyitem.DEl);
       7     }
       8     else if ((String)clickedButton.Content == "AC")
       9     {
      10         MyKeyDown(EKeyitem.AC);
      11     }
      12     else if ((String)clickedButton.Content == "確認(rèn)")
      13     {
      14         MyKeyDown(EKeyitem.OK);
      15         //this.Close();
      16     }
      17     else if ((String)clickedButton.Content == "A/a")
      18     {
      19         for (int j = 1; j < 4; j++)
      20         {
      21             Grid grd = ButtonGrid.Children[j] as Grid;
      22             int count2 = grd.Children.Count;
      23             for (int i = 0; i < count2; i++)
      24             {
      25                 Button buttonTemp = grd.Children[i] as Button;
      26                 String contentTemp = buttonTemp.Content as String;
      27                 if (contentTemp == "AC" || contentTemp == "A/a")
      28                     continue;
      29                 buttonTemp.Content = contentTemp[0] > 90 ? contentTemp.ToUpper() : contentTemp.ToLower();
      30             }
      31         }
      32         
      33     }
      34     else
      35     {
      36         MyKeyDown((String)clickedButton.Content);
      37     }
      38 }

       

      外部使用,常規(guī)usercontrol一樣使用,先是引入命名空間xmlns:local="clr-namespace:xxx,由于虛擬鍵盤(pán)有一個(gè)特性 ,比如我們點(diǎn)擊文本框那么它應(yīng)該出現(xiàn),且出現(xiàn)的位置剛好在文本框下方,我點(diǎn)回車虛擬鍵盤(pán)消失,那么這里有一丁丁的奇技淫巧,那就是可以進(jìn)行絕對(duì)定位的canvas組件。

      1 <Grid>    
      2 <TextBox Width="300" Height="50" FontSize="25" Name="tbx_QueryCode" Text="" PreviewMouseDown="tbx_QueryCode_PreviewMouseDown" KeyDown="tbx_QueryCode_KeyDown" GotFocus="tbx_QueryCode_GotFocus"></TextBox>
      3 <Canvas Name="vkContext" Focusable="False" >
      4             <local:VKeyBoard Canvas.Left="50" Focusable="False" Canvas.Top="100" Visibility="Hidden"  x:Name="myvk"></local:VKeyBoard>
      5         </Canvas>
      6     </Grid>

      文本框獲取焦點(diǎn)時(shí)

      1 private void tbx_QueryCode_GotFocus(object sender, RoutedEventArgs e)
      2 {
      3     myvk.Visibility = Visibility.Visible;
      4     focusTbx = tbx_QueryCode;
      5     RePointKeyBoard();
      6 }

      虛擬鍵盤(pán)的聚焦

       1 public void RePointKeyBoard()
       2 {
       3     if (focusTbx != null)
       4     {
       5         Point p = focusTbx.TranslatePoint(new Point(0, 0), windContent);
       6                                                                         
       7         this.myvk.SetValue(Canvas.LeftProperty, p.X);
       8         this.myvk.SetValue(Canvas.TopProperty, p.Y + focusTbx.Height);
       9     }
      10 
      11 }

      還有就是虛擬鍵盤(pán)外露給我們事件的處理。

      開(kāi)始時(shí)綁定事件

      1 private void Window_Loaded(object sender, RoutedEventArgs e)
      2 {
      3     myvk.MyKeyDown = MyKeyDown;
      4 
      5 }

      外露事件處理

       1 //虛擬鍵盤(pán)事件
       2 private void MyKeyDown(object _key)
       3 {
       4     if (focusTbx == null)
       5     {
       6         myvk.Visibility = Visibility.Hidden;
       7         return;
       8     }
       9     EKeyitem key = EKeyitem.A;
      10     if (_key.GetType() == typeof(EKeyitem))
      11         key = (EKeyitem)_key;
      12 
      13     if (key == EKeyitem.DEl)
      14     {
      15         if (focusTbx.Text.Length > 0)
      16         {
      17             focusTbx.Text = focusTbx.Text.Substring(0, focusTbx.Text.Length - 1);
      18         }
      19     }
      20     else if (key == EKeyitem.AC)
      21     {
      22         focusTbx.Text = "";
      23     }
      24     else if (key == EKeyitem.OK)
      25     {
      26 
      27         myvk.Visibility = Visibility.Hidden;
      28         if (vm.LoginOK == true && focusTbx == tbx_QueryCode)
      29         {
      30             valueString = focusTbx.Text;
      31             //this.Close();
      32             BarCodeInputKeyDown();
      33         }
      34     }
      35     else if (key == EKeyitem.Shift)
      36     {
      37 
      38     }
      39     else
      40     {
      41         focusTbx.Text += _key.ToString();
      42     }
      43 }

       

      posted @ 2021-04-28 14:53  assassinx  閱讀(1504)  評(píng)論(1)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产精品一区二区三区激情| 白嫩少妇bbw撒尿视频| 中文熟妇人妻av在线| 亚洲人成人影院在线观看| 男女性杂交内射女bbwxz| 丰满熟妇人妻中文字幕| 日韩国产成人精品视频| 男人猛躁进女人免费播放| 亚洲中文一区二区av| 国产成人av性色在线影院| 白白发布视频一区二区视频| 鹿泉市| 日韩无人区码卡1卡2卡| 日夜啪啪一区二区三区| 日韩精品亚洲专在线电影| 人与禽交av在线播放| 国产av普通话对白国语| 四虎成人高清永久免费看| 久久久精品2019中文字幕之3| 国产精品自拍视频我看看| 汉川市| 国产色无码专区在线观看| 亚洲成年av天堂动漫网站| 中文文字幕文字幕亚洲色| 久久66热人妻偷产精品| 和黑人中出一区二区三区| 日韩人妻无码精品久久| 婷婷五月综合激情| 永康市| 亚洲精品一区二区美女| 国产欧洲欧洲久美女久久| 丰满熟妇人妻中文字幕| 资源在线观看视频一区二区| 日本亚洲一区二区精品久久| 日产日韩亚洲欧美综合下载| 动漫精品中文字幕无码| 国产午夜亚洲精品国产成人| 久久99精品久久99日本| 人妻少妇精品视频三区二区 | 亚洲天堂激情av在线| 亚洲国产理论片在线播放|