MENU

blog
スタッフブログ

dot
[WPF]Byte制限ができるTextBoxを作る
技術

[WPF]Byte制限ができるTextBoxを作る

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

最近は毎日暑くてしんどいですね><
去年のこの時期は夜寝るときもエアコンなしでも大丈夫だったのに今年は毎日エアコンが必須です
電気代も気になるところですが、健康を優先して適切な温度を保って過ごしていきましょう!

今回はWPFにてByte制限をかけれるTextBoxを作っていきたいと思います。
文字数での制限は「MaxLength」を使用すれば大丈夫なのですが、半角何文字、全角何文字で制限をかけたいときには使用できないので、1つ拡張を作ってプロパティで使えるようにしたいと思います!

完成イメージ

少しわかりにくいですが下記の画像のように半角では14文字、全角では7文字で制限をかけることができます!

半角14文字、全角7文字で制限

ソースコード

それでは実際のソースコードです
今回はTextBoxを拡張して「MaxByte」のプロパティを作成しました
C#で作成しています!

ByteLimitTextBox.cs

using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace WpfApp1
{
    class ByteLimitTextBox : TextBox
    {
        public static readonly DependencyProperty MacByteProperty =
            DependencyProperty.Register("MaxByte", typeof(int), typeof(ByteLimitTextBox), new PropertyMetadata(null));

        /// <summary>
        /// 最大バイト数
        /// </summary>
        public int MaxByte
        {
            get
            {
                return (int)GetValue(MacByteProperty);
            }
            set
            {
                SetValue(MacByteProperty, 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;
            }
        }
    }
}

MainWindow.xaml

あとはこれをWindowのXAMLで呼び出すだけです!

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="400">
    <Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
            <local:ByteLimitTextBox MaxByte="14" Width="150"/>
            <local:ByteLimitTextBox MaxByte="14" Width="150" Margin="0,20"/>
        </StackPanel>
    </Grid>
</Window>

最後に

プロパティの作り方さえわかってしまえばいろんな拡張を作成できそうですね!
ただ、最初から用意されていないのが難点です・・


それでは!今回はこの辺で(^^)/

dot
dot
PAGETOP