日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF制作的一个小功能,智能提示(IntelliSense)

發布時間:2025/3/13 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF制作的一个小功能,智能提示(IntelliSense) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
WPF制作的一個小功能,智能提示(IntelliSense)

原文 http://www.cnblogs.com/scheshan/archive/2012/06/30/2570867.html

最近WPF項目中遇到一個需求,需要給一個RichTextBox添加智能提示(IntelliSense)功能。

分析下具體的需求,在用戶鍵入"@"符號時,應該顯示一個彈出框,把所有用戶列出。用戶可以通過鍵盤、鼠標等進行選擇。用戶列表可能數據比較多,那么用戶還應該可以輸入字符進行篩選。用過各種IDE開發工具的童鞋應該對這樣的效果很了解了,具體效果如下

輸入@符號的效果:

篩選的效果:

再談談具體的開發思路.

1.如何制作可以實現列表選擇功能的彈出框

  方法很多,Popup+ListBox可以完美解決.此處我為了省代碼,直接用的ListBox

2.如何在鍵入@符號時,將ListBox顯示在@符號之后

  在VisualStudio的智能提示里,當我們觸發了IntelliSense時,提示框會顯示,并且與下一字符的插入點對齊。TextPointer類提供了方法可以獲取到某個插入點的坐標:

1 RichTextBox textbox = this.RichTextBox; 2 TextPointer start = textbox.Selection.Start; 3 Rect rect = start.GetCharacterRect(LogicalDirection.Forward); 4 Point point = rect.BottomLeft;

  我們可以注冊RichTextBox的鍵盤事件,判斷用戶是否鍵入@符號。@符號是由“Shift”+“2”組成,Keyboard.Modifiers可以獲取到組合鍵:

1 if (Keyboard.Modifiers == ModifierKeys.Shift && e.Key == Key.D2) 2 { 3 //TODO: 用戶鍵入了@符號 4 }

  在TODO里,將ListBox移動到得到Point位置即可。

3.如何實現選擇和篩選

  篩選功能很簡單,保存一個局部變量,在智能提示框顯示后記錄用戶輸入,智能提示框隱藏后清空,智能提示框中的數據按照該變量進行過濾即可。

  當智能提示框顯示的時候,用戶是可以鍵入“上”,“下”鍵進行移動選擇的。也許在敲了幾次方向鍵,用戶還想繼續輸入字符進行篩選。最開始,我是 用的ListBox自動的選擇功能,當用戶敲入方向鍵,我就將鍵盤焦點(WPF中分鍵盤焦點和邏輯焦點,這個也是困擾我很久的問題)設置到ListBox 上,那么用戶就可以敲入“上”,“下”鍵進行移動選擇了??雌饋砗芎唵?#xff0c;但是這樣是有問題的,因為用戶如果想繼續敲入字符篩選,我還必須將鍵盤焦點重新設 置到RichTextBox上,否則用戶的敲擊是無效的。

  后來突然想通了,在用戶敲擊“上”,“下”鍵時,只需要調用ListBox的MoveCurrentToPrevious()和 MoveCurrentToNext()即可,這樣給用戶的錯覺還是有了上下移動的效果。焦點不在ListBox上時,這樣的移動可能造成當前選中項超出 了顯示范圍之外,那么可以通過ListBox的ScrollIntoView()方法,將選中對象滾動到視圖中。

  下面是截取的一段代碼:

1           //如果按了向下鍵,則把選中項下移 2 if (e.Key == Key.Down) 3 { 4 if (UserList.CurrentPosition != UserList.Count - 1) 5 { 6 lbUser.Items.MoveCurrentToNext(); 7 lbUser.ScrollIntoView(lbUser.Items.CurrentItem); 8 } 9 e.Handled = true; 10 } 11 //如果按了向上鍵,則把選中項上移 12 if (e.Key == Key.Up) 13 { 14 if (UserList.CurrentPosition != 0) 15 { 16 lbUser.Items.MoveCurrentToPrevious(); 17 lbUser.ScrollIntoView(lbUser.Items.CurrentItem); 18 } 19 e.Handled = true; 20 }

4.實現選中和取消
  選中功能就更簡單了,分別加入對鼠標雙擊,空格,回車,TAB等的判斷,將ListBox的當前選中項的文本插入到 RichTextBox中即可。需要注意的是,此處要對單擊做判定,由于單擊ListBox會使鍵盤焦點設置到其之上,因此要強制將鍵盤焦點從 ListBox移開。判斷ESC鍵,使ListBox隱藏即可實現取消功能。

5.如何實現擴展

  做一個功能最重要的就是考慮以后的重用,此處可以公開 KeyBoard.Modifyers,KeyCode,IEnumable<T>為依賴屬性,前2個代表在敲入什么組合鍵時會彈出智能提示 框,最后一個是彈出內容的數據源。由于此處的篩選功能是在控件內部,那么我們可以定義一個接口,包含一個Name屬性?!?/p> 1 public interface IData 2 { 3 //用于篩選和插入的名稱 4 string Name { get; set; } 5 }

  將上面的IEnumable<T>改為IEnumable<IData>。

  以后的調用方,只需要將這3個中的一個或多個傳入,即可實現智能提示功能。

posted on 2013-07-25 08:39 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/3213592.html

總結

以上是生活随笔為你收集整理的WPF制作的一个小功能,智能提示(IntelliSense)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。