WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

這篇文章將為大家詳細(xì)講解有關(guān)WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)站重做改版、翁源網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5場(chǎng)景定制成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為翁源等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

前兩天做一個(gè)項(xiàng)目的時(shí)候,由于頁(yè)面沒(méi)有限制TextBox的輸入長(zhǎng)度,所以,后臺(tái)直接報(bào)錯(cuò)了,超出數(shù)據(jù)庫(kù)最大的長(zhǎng)度。

數(shù)據(jù)庫(kù)的長(zhǎng)度是按照字節(jié)來(lái)計(jì)算的,而且不同的編碼格式,漢字占用的字節(jié)長(zhǎng)度又不相同,比如,我們用的是UTF8,一個(gè)漢字是3個(gè)字節(jié),而默認(rèn)的Default,一個(gè)漢字是2個(gè)字節(jié)。

TextBox有個(gè)MaxLength屬性,但是這個(gè)屬性是不太合乎要求的,因?yàn)檫@個(gè)長(zhǎng)度,是限制了輸入的長(zhǎng)度,比如設(shè)置20,則無(wú)論是數(shù)字、字母、漢字最大的長(zhǎng)度都是20個(gè),但是,對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),長(zhǎng)度卻不相同了,所以,不能使用這個(gè)屬性。

為了,統(tǒng)一解決下這個(gè)問(wèn)題,所以給TextBox寫(xiě)了附加屬性。

一、想要的效果

用了附加屬性,想達(dá)到一個(gè)什么效果呢,就是像設(shè)置MaxLength一樣,一旦到了數(shù)據(jù)庫(kù)的字節(jié)長(zhǎng)度,就不再能輸入了。

因此,最開(kāi)始想找一個(gè)限制輸入的屬性,可惜我學(xué)的太淺薄,沒(méi)有找到相關(guān)的屬性,因此,最后在同事的提醒下,可以記錄上一次的內(nèi)容,然后,如果超長(zhǎng),就用上一次的內(nèi)容進(jìn)行賦值

WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

二、附加屬性

既然要用附加屬性,并且方便使用,那肯定要給開(kāi)發(fā)者暴露出來(lái)至少兩個(gè):MaxByteLength用來(lái)設(shè)置最大的字節(jié)數(shù),EncodeModel用來(lái)設(shè)置編碼格式

EncodeModel是用Menu類(lèi)型來(lái)做的,方便使用時(shí)直接敲內(nèi)容

WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

本來(lái)上面是直接想用Encoding來(lái)做的,奈何它是抽象類(lèi),只好,寫(xiě)個(gè)方法進(jìn)行了一部轉(zhuǎn)化,并且把Encoding類(lèi)型的屬性進(jìn)行private。

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

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;//文本長(zhǎng)度
  if (GetMaxByteLength(obj) >= txtLength)
  {
  SetPreText(obj, txt);
  return false;
  }
  return true;
 }
 }

使用方法如下:

WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能

MaxByteLength是必須設(shè)置的沒(méi)有進(jìn)行默認(rèn),EncodeModel可以不設(shè)置但是由于是我們自己用,所以默認(rèn)是UTF8,可以自行修改代碼,按照你們公司的編碼格式,這樣也就不用賦值了。

 代碼已修正,感謝Presia發(fā)現(xiàn)的BUG,疏忽了。

關(guān)于“WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

名稱(chēng)欄目:WPF中TextBox如何實(shí)現(xiàn)按字節(jié)長(zhǎng)度限制輸入功能
網(wǎng)站路徑:http://bm7419.com/article24/pcidce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)網(wǎng)站營(yíng)銷(xiāo)、微信小程序、標(biāo)簽優(yōu)化網(wǎng)站設(shè)計(jì)公司、全網(wǎng)營(yíng)銷(xiāo)推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)