Blog

[WPF]byte数で文字数を制限するTextBox

こんにちは!
ソリューションセクションのHです。

先日友人と今流行りのオンライン飲み会をしました。
オンラインで自宅にいながら友人と話せる今の世の中はすごいですね
コロナの感染者もまた徐々に増えてきているので、オンラインなども活用しながら楽しく安全に過ごせるといいですね!🐰

今回はWPFのTextBoxでバイト数での文字数制限を紹介したいと思います。
WPFのTextBoxってMaxLangthっていうプロパティはありますが、
これが全角でも半角でも指定した文字数しか制限できない・・・

全角なら何文字、半角なら何文字っていう感じで文字数制限したい!っということで
入力された文字のバイト数を確認して制限をかける拡張TextBoxを作成しました

完成すると以下のようになります
下の画像は14バイトで制限をかけているので全角は7文字、半角は14文字入ります

以下、拡張TextBoxのコードです。




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApp2
{
    class SampleTextBox : TextBox
    {

        public static readonly DependencyProperty MaxByteProperty =
            DependencyProperty.Register("MaxByte", typeof(int), typeof(SampleTextBox), new PropertyMetadata(null));

        /// <summary>
        /// バイト数制限用プロパティ
        /// </summary>
        public int MaxByte
        {
            get
            {
                return (int)GetValue(MaxByteProperty);
            }
            set
            {
                SetValue(MaxByteProperty, value);
            }
        }

        protected override void OnPreviewTextInput(TextCompositionEventArgs e)
        {
            base.OnPreviewTextInput(e);
            Encoding en = Encoding.GetEncoding("shift-jis");
            //入力された文字列のバイト数取得
            var byteCount = en.GetByteCount(this.Text);
            if (byteCount >= MaxByte)
            {
                string newTrxt = new string(this.Text.TakeWhile((c, i) => en.GetByteCount(Text.Substring(0, i + 1)) <= MaxByte).ToArray());
                this.Text = newTrxt;
                this.Select(this.Text.Length, 0);
                e.Handled = true;
                return;
            }
        }
    }
}

これをXAML側で呼びだす際にMaxByteプロパティを設定すればOKです。




<local:SampleTextBox MaxByte="14" Width="150" Height="25"/>

ここ最近はWPFを使用しての業務が多いのでWPFのことが多くなってしまいますね
WEB系の技術的なことを書けるよう勉強しないとですね

それでは!