WPF開發之限制輸入的控制項

2021-07-13 07:55:31 字數 3217 閱讀 1926

在杭州報考了今年的研考,但是今天才發現杭州招生點昨天就結束了網上繳費,雖然還是在支付裡面成功付了錢,但是還是有很大的可能不讓考了。很是絕望,心情不好不想複習,就跑來寫了這篇很久以前就準備寫的部落格。

公司專案原來使用winforms開發的gui,進來的時候都是用的現成的方法實現限制輸入的格式。雖然寫的不是很好(原來使直接限制輸入的字元),但也懶得去改那些**。後來組裡開始轉用wpf來實現gui,於是也就沒有現成的可以直接用了。因為需求要求必須限定輸入的字元,想著後面肯定也得用,就去決定自己去實現一下。

一開始想著wpf是否直接提供了相應的屬性可以直接設定,但是找了一會沒發現,網上很多方法也不適合。然後準備按之前winforms實現的方法來實現,即通過過濾字元來實現,如限制了只能輸入0-9的數字。但是在完成之後覺得還是不好,在允許輸入小數點和負號後就可以輸入例如1.1.1這樣的字串,而且wpf中判斷字元比winforms中稍微複雜一下,然後就決定用正規表示式來實現輸入的限制。

因為要將這個功能直接封裝成乙個控制項供後面使用,就直接從system.windows.controls.textbox繼承,這樣就不用去實現文字框的具體細節了,同理combobox也是直接繼承自system.windows.controls.combobox。因為需求中需要滿足多種限定條件,如輸入浮點數等,於是就開放了乙個屬性供選擇限定的型別,再根據選擇的型別確定正規表示式。其實也可以直接開放正規表示式字串屬性可以設定,但是當時因為寫好了又懶得改就沒有再去修改了(其實不就是把privatepublic,懶死算了)。

if (regexstring == null)

}

有了正規表示式字串後,就要開始實現限制輸入了。最開始想通過textchanged事件來實現,但是發現有些情況下的結果不理想(但是由於時間過長忘記了),於是就轉用previewtextinput事件來實現。在previewtextinput事件的textcompositioneventargs引數中有text這個屬性,也就是當前輸入的文字,不是全部的。而控制項本身的text屬性中儲存的就是輸入前的文字,於是就想到this.text + e.text不就是完整的文字,馬上就試了一下,發現是可行的。

if (!regex.ismatch(this.text + e.text, regexstring))

實現後試了幾次後還是發現了乙個問題,在非最末端輸入會得到錯誤的結果,於是又開始嘗試能不能得到輸入的位置。於是在除錯的過程中發現了textboxcaretindex屬性(沒錯。。。我是在除錯的時候看到的。。。懶得去看文件),於是就變成了這樣。

if (!regex.ismatch(this.text.insert(this.caretindex, e.text), regexstring))

然後很愉快地在任何地方輸入都對了~但是還沒完。。。發現在選中一段文字後輸入(覆蓋掉原來選中的)以及刪除時還是會錯啊。。。又在除錯的時候找啊找,於是找到了selectionlength屬性,它是選中的文字長度。然後就很愉快地解決了這個問題。

private void previewtextinput(object sender, textcompositioneventargs e)

}catch (exception)

}

然而,沒愉快多久,問題又來了。previewtextinput在貼上的時候不管用,而且需求要求不讓用貼上。查了一下資料後發現previewexecutedevent可以實現攔截貼上操作,但是textbox不能直接新增這個事件,就找到了可以用addhandler來新增,具體**如下。

this.addhandler(

system.windows.input.commandmanager.previewexecutedevent,

new executedroutedeventhandler(this.previewexecuted)

); // 在建構函式中加入

private void previewexecuted(object sender, executedroutedeventargs e)

}

至此,就差不多算是完成了乙個可以限制輸入的textbox的控制項。

實現combobox的過程中發現combobox沒有caretindexselection,但是在除錯的時候發現combobox內部有個私有的textbox,所以就用反射取得了textbox。在取得combobox後基本實現方法就和textbox一致了。

private void previewtextinput(object sender, system.windows.input.textcompositioneventargs e)

}catch (exception)

}private void previewexecuted(object sender, executedroutedeventargs e)

}

在實現過程中查閱了不少資料,因為寫這篇文章的時候離寫這些控制項已經很挺長一段時間了,也就忘了其中很多的過程了,在文章中也就沒有寫出來。這些控制項的實現方法也有很多,我也只是寫出了我自己實現的方式,也希望能夠幫助到看到這篇文章的人。因為接觸wpf的時間不長,可能會犯一些錯誤,也希望各位能夠指出。

在使用輸入法輸入的時候,可能會出現限制失效的情況,這時候可以通過在xaml檔案中設定文字框的屬性input:inputmethod.isinputmethodenabled="false"禁用輸入法即可,例如:

input:inputmethod.isinputmethodenabled

="false"

/>

WPF控制項開發之控制項概述 2

更改控制項外觀 更改控制項的外觀以適應應用程式的外觀,這是很常見的操作。可以根據您要達到的效果,通過執行以下操作之一來更改控制項的外觀 更改控制項的屬性值。為控制項建立 style。為控制項建立新 controltemplate。更改控制項的屬性值 許多控制項具有允許您更改控制項外觀的屬性,例如 b...

輸入控制項控制輸入限制

我們在很多時候需要控制輸入框的輸入限制,比如註冊的時候,限制只能輸入數字,日期等,當然,限制方式很多,今天介紹一種通過js來實現的一種即時控制限制,也就是在你輸入的時候就給予限制 也就是163郵箱註冊的時候,那個日期控制的效果,那麼怎麼實現呢,其實很簡單,看個例子,比如我們想來控制inputtext...

WPF 限制Textbox輸入的內容

限制文字框textbox的輸入內容,在很多場景都有應用。舉個例子,現在文字框中,只能輸入0 1 2 3 4 5 6 7 8 9 這11個字元。限制輸入0 9很容易實現,關鍵是這個 符號。它在wpf中對應的是key.oempipe鍵。如果直接允許該鍵輸入,那麼會有 這個符號也可以輸入。那麼問題來了,怎...