一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - WPF TextBox實現按字節長度限制輸入功能

WPF TextBox實現按字節長度限制輸入功能

2022-01-25 14:20衆尋 C#

這篇文章主要為大家詳細介紹了WPF TextBox實現按字節長度限制輸入功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前兩天做一個項目的時候,由于頁面沒有限制textbox的輸入長度,所以,后臺直接報錯了,超出數據庫最大的長度。

數據庫的長度是按照字節來計算的,而且不同的編碼格式,漢字占用的字節長度又不相同,比如,我們用的是utf8,一個漢字是3個字節,而默認的default,一個漢字是2個字節。

textbox有個maxlength屬性,但是這個屬性是不太合乎要求的,因為這個長度,是限制了輸入的長度,比如設置20,則無論是數字、字母、漢字最大的長度都是20個,但是,對于數據庫來說,長度卻不相同了,所以,不能使用這個屬性。

為了,統一解決下這個問題,所以給textbox寫了附加屬性。

一、想要的效果

用了附加屬性,想達到一個什么效果呢,就是像設置maxlength一樣,一旦到了數據庫的字節長度,就不再能輸入了。

因此,最開始想找一個限制輸入的屬性,可惜我學的太淺薄,沒有找到相關的屬性,因此,最后在同事的提醒下,可以記錄上一次的內容,然后,如果超長,就用上一次的內容進行賦值

WPF TextBox實現按字節長度限制輸入功能

WPF TextBox實現按字節長度限制輸入功能

二、附加屬性

既然要用附加屬性,并且方便使用,那肯定要給開發者暴露出來至少兩個:maxbytelength用來設置最大的字節數,encodemodel用來設置編碼格式

encodemodel是用menu類型來做的,方便使用時直接敲內容

WPF TextBox實現按字節長度限制輸入功能

本來上面是直接想用encoding來做的,奈何它是抽象類,只好,寫個方法進行了一部轉化,并且把encoding類型的屬性進行private。

大致上也就是這么一個思路,下面上代碼,給需要的人使用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
public class maxbyteattachedproperty : dependencyobject
 {
 public enum encode
 {
  default,
  ascii,
  utf8,
  utf32,
  utf7,
  bigendianunicode,
  unicode
 }
 
 
 private static string getpretext(dependencyobject obj)
 {
  return (string)obj.getvalue(pretextproperty);
 }
 
 private static void setpretext(dependencyobject obj, string value)
 {
  obj.setvalue(pretextproperty, value);
 }
 
 // using a dependencyproperty as the backing store for pretext. this enables animation, styling, binding, etc...
 private static readonly dependencyproperty pretextproperty =
  dependencyproperty.registerattached("pretext", typeof(string), typeof(maxbyteattachedproperty), new propertymetadata(""));
 
 
 public static int getmaxbytelength(dependencyobject obj)
 {
  return (int)obj.getvalue(maxbytelengthproperty);
 }
 
 public static void setmaxbytelength(dependencyobject obj, int value)
 {
  obj.setvalue(maxbytelengthproperty, value);
 }
 
 // using a dependencyproperty as the backing store for maxbytelength. this enables animation, styling, binding, etc...
 public static readonly dependencyproperty maxbytelengthproperty =
  dependencyproperty.registerattached("maxbytelength", typeof(int), typeof(maxbyteattachedproperty), new propertymetadata(ontextboxpropertychanged));
 
 private static void ontextboxpropertychanged(dependencyobject d, dependencypropertychangedeventargs e)
 {
  textbox tb = d as textbox;
  if (tb == null)
  {
  return;
  }
  tb.textchanged += tb_textchanged;
 }
 
 private static void tb_textchanged(object sender, textchangedeventargs e)
 {
  textbox tb = sender as textbox;
  if (isoutmaxbytelength(tb.text, tb))
  {
  tb.text = getpretext(tb);
  tb.select(tb.text.length, 0);
  return;
  }
 }
 
 public static encode getencodemodel(dependencyobject obj)
 {
  return (encode)obj.getvalue(encodemodelproperty);
 }
 
 public static void setencodemodel(dependencyobject obj, encode value)
 {
  obj.setvalue(encodemodelproperty, value);
 }
 
 // using a dependencyproperty as the backing store for encodem. this enables animation, styling, binding, etc...
 public static readonly dependencyproperty encodemodelproperty =
  dependencyproperty.registerattached("encodemodel", typeof(encode), typeof(maxbyteattachedproperty), new propertymetadata(encode.utf8, onencodemodelchanged));
 private static void onencodemodelchanged(dependencyobject d, dependencypropertychangedeventargs e)
 {
  setem(d, getencodemodel(d));
 }
 
 private static encoding getencodingmodel(dependencyobject obj)
 {
  return (encoding)obj.getvalue(encodingmodelproperty);
 }
 
 private static void setencodingmodel(dependencyobject obj, encoding value)
 {
  obj.setvalue(encodingmodelproperty, value);
 }
 
 // using a dependencyproperty as the backing store for encodingmodel. this enables animation, styling, binding, etc...
 private static readonly dependencyproperty encodingmodelproperty =
  dependencyproperty.registerattached("encodingmodel", typeof(encoding), typeof(maxbyteattachedproperty), new propertymetadata(encoding.utf8));
 
 private static void setem(dependencyobject obj, encode e)
 {
  switch (e)
  {
  case encode.default:
   setencodingmodel(obj, encoding.default);
   break;
  case encode.ascii:
   setencodingmodel(obj, encoding.ascii);
   break;
  case encode.utf8:
   setencodingmodel(obj, encoding.utf8);
   break;
  case encode.utf32:
   setencodingmodel(obj, encoding.utf32);
   break;
  case encode.utf7:
   setencodingmodel(obj, encoding.utf7);
   break;
  case encode.bigendianunicode:
   setencodingmodel(obj, encoding.bigendianunicode);
   break;
  case encode.unicode:
   setencodingmodel(obj, encoding.unicode);
   break;
  default:
   break;
  }
 }
 
 private static bool isoutmaxbytelength(string txt, dependencyobject obj)
 {
  int txtlength = getencodingmodel(obj).getbytes(txt).length;//文本長度
  if (getmaxbytelength(obj) >= txtlength)
  {
  setpretext(obj, txt);
  return false;
  }
  return true;
 }
 }

使用方法如下:

WPF TextBox實現按字節長度限制輸入功能

maxbytelength是必須設置的沒有進行默認,encodemodel可以不設置但是由于是我們自己用,所以默認是utf8,可以自行修改代碼,按照你們公司的編碼格式,這樣也就不用賦值了。

 代碼已修正,感謝presia發現的bug,疏忽了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/ZXdeveloper/archive/2017/11/07/7798943.html

延伸 · 閱讀

精彩推薦
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
主站蜘蛛池模板: 波多野结衣不卡 | 国产三级精品91三级在专区 | 欧洲另类一二三四区 | 福利社在线免费观看 | 久久久免费观成人影院 | 国产亚洲sss在线观看 | 日本视频在线观看播放 | 日韩成人免费 | 日本成人黄色网址 | 日韩拍拍拍 | 特黄aa级毛片免费视频播放 | 四虎最新永久在线精品免费 | 好大好爽好舒服视频 | 美女和男人免费网站视频 | 欧美 亚洲 一区 | 狠狠综合视频精品播放 | poronovideos极度残酷 | www.四虎.com| 91传媒制片厂制作传媒破解版 | 亚洲美女人黄网成人女 | 四虎在线播放 | 男人免费视频 | 久久毛片基地 | youyjzzcom最新欧美 | 免费日批视频 | 日本高清全集免费观看 | 国产1广场舞丰满老女偷 | 精品国产成人AV在线看 | 亚洲狼人香蕉香蕉在线28 | 美女全身体光羞羞漫画 | 国产农村乱子伦精品视频 | 免费观看网站 | 青青草一区二区免费精品 | 美女扒开腿让男人桶爽动态图片 | 99re这里只有精品视频 | 天天久久影视色香综合网 | 欧美xxxxx九色视频免费观看 | 日韩欧美综合在线二区三区 | 思思91精品国产综合在线 | yellow视频在线观看 | 天天综合天天综合色在线 |