【Silverlight】 数値のみ入力可能なTextBoxコントロールを作成するには

◆ XAML

// 概要:数値入力用ユーザコントロール
// 機能:数値のみ入力可能に制限。
//       プロパティにより、通貨型を指定可能。
//       通貨型の場合、フォーカスアウト時にカンマ編集を行う。

<TextBox 
    x:Class="Controls.NumericEditor"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    GotFocus="TextBox_GotFocus"
    LostFocus="TextBox_LostFocus"
>

◆ C# Code

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace Controls
{
    public partial class NumericEditor : TextBox
    {
        public enum NumericTypeItem
        {
            // 数字
            Numeric,
            // 通貨
            Currency,
        }

        public NumericTypeItem NumericType { set; get; }

        public NumericEditor()
        {
            InitializeComponent();
            this.Loaded += OnLoaded;
        }

        // ビュー読み込み後の処理。
        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            // IME制御
            InputMethod.SetPreferredImeState(this, InputMethodState.On);

            switch (NumericType)
            {
                case NumericTypeItem.Numeric:
                    goto case NumericTypeItem.Currency;
                case NumericTypeItem.Currency:
                    this.MaxLength = 9;
                    InputMethod.SetPreferredImeConversionMode
                        (this, ImeConversionModeValues.Alphanumeric);
                    InputMethod.SetIsInputMethodEnabled(this, false);
                    break;                
            }
        }

        // テキストが入力された時のアクションを指定します。
        protected override void OnTextInput(TextCompositionEventArgs e)
        {
            // 数値の場合のみ入力可能とする
            switch (NumericType)
            {
                case NumericTypeItem.Numeric:
                    goto case NumericTypeItem.Currency;
                case NumericTypeItem.Currency:
                    // 数値チェック
                    if (CheckList.IsNumericString(e.Text)) 
                        base.OnTextInput(e);
                    break;                
            }
        }
        
        // フォーカスを受け取った時のアクションを指定します。
        private void TextBox_GotFocus(object sender, RoutedEventArgs e)
        {
            switch (NumericType)
            {
                case NumericTypeItem.Currency:
                    this.Text = this.Text.Replace(",", "").Replace("\","");
                    break;
            }
        }

        // フォーカスが外れた時のアクションを指定します。
        private void TextBox_LostFocus(object sender, RoutedEventArgs e)
        {
            switch (NumericType)
            {
                case NumericTypeItem.Currency:
                    decimal tryValue;
                    if (decimal.TryParse(this.Text, out tryValue))
                        this.Text = decimal.Parse(this.Text).ToString("C");
                    break;
            }            
        }
    }
}

// 数値文字列のチェックに使用する正規表現
private readonly Regex NUMERIC_STRING = new Regex("^([0-9])*$");

// 検証値が数値文字のみで構成される文字列であることをチェックします。
private bool IsNumericString(string value)
{
    if (value.Length == 0)
    {
        return true;
    }

    return NUMERIC_STRING.IsMatch(value);
}

◆ 使用例(XAML)

// 数値入力TextBox
<ctl:NumericEditor NumericType="Numeric" Name="txtTest1" />
// 通貨入力TextBox
<ctl:NumericEditor NumericType="Currency" Name="txtTest2" />

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中