TextBox的自动完成格式化?

时间:2017-01-20 03:32:39

标签: c# wpf

我一直在寻找一种在用户输入数据时使用TextBox格式的方法。

我已经制作了一个可以实现我想要的黑客攻击,但是由于你不小心按下两个键可能会导致if语句失败以及尝试通过用户Delete Key

无论如何,这不是问题,这是我现在使用的代码:

从这个类调用方法,第一个方法向字符串添加逗号,第二个方法检查用户输入完成后是否有逗号。

class BonusData
{
    public class DoDataTextBox
    {
        public static void AutoComplete(TextBox textBox, int counter)
        {
            if (textBox.Text.Length - counter == 3)
            {
                textBox.Text = textBox.Text + ",";
                textBox.SelectionStart = textBox.Text.Length;
            }
            else if (textBox.Text.Length - counter == 7)
            {
                textBox.Text = textBox.Text + ",";
                textBox.SelectionStart = textBox.Text.Length;
            }
            else if (textBox.Text.Length - counter == 11)
            {
                textBox.Text = textBox.Text + ",";
                textBox.SelectionStart = textBox.Text.Length;
            }
        }

        public static void CheckLastCharacter(TextBox textBox)
        {
           if (textBox.Text.Length < 2) return;
           if (textBox.Text.Substring(textBox.Text.Length - 1) != ",") return;
           {
              textBox.Text = textBox.Text.Substring(0, textBox.Text.Length - 1);
           }
        }
    }    
}

事件处理程序,

private void SecondMonthRowOne_OnKeyUp(object sender, KeyEventArgs e)
{
    int counter = 0;
    if (IsText)
    {
        counter = 1;
    }
    BonusData.DoDataTextBox.AutoComplete((TextBox)sender, counter);
}


private void SecondMonthRowOne_OnGotFocus(object sender, RoutedEventArgs e)
{
    if (e.ToString() != String.Empty) return;
    IsText = true;
}


private void SecondMonthRowOne_OnLostFocus(object sender, RoutedEventArgs e)
{

    BonusData.DoDataTextBox.CheckLastCharacter((TextBox)sender);
    IsText = false;
}

这给出了这样的结果,

  

999999999

就像我说它在98%的时间里工作一样,但我希望在WPF中有另一种方法可以做到这一点。我搜索的范围很广,但我甚至都不知道这是什么东西。

2 个答案:

答案 0 :(得分:0)

我建议您使用&#34; WPF TextBox AutoComplete&#34;代替。它是一个包含在NuGet包中的WPF附加行为。

您可以使用NuGet包管理器为您的WPF项目添加此包,只需将此包添加到您的项目中。 这个NuGet包也是开源的,因此您可以进一步定制它以满足您的需求/要求。

源代码托管在此GitHub仓库:https://github.com/Nimgoble/WPFTextBoxAutoComplete

注意:我还没有针对.NET 4.6对这个WPF库进行全面测试。该库是以.NET 4.5为目标编译的。但据我所知,它与.NET 4.6中的WPF 100%兼容。

答案 1 :(得分:0)

没有使用任何外部插件,我发现这个工作非常好,

这将每隔三个字符添加一个Comma,并允许用户一次删除一个字符。

TextBox格式如下所示,

  

999,999,999,999

enter image description here

代码,

    public class DoDataTextBox
    {
        public static void AutoCompleteStringBuild(TextBox textBox)
        {
            string endResult = null;

            string replace = Reverse(textBox.Text).Replace(",", "");
            int count = 1;
            char[] value = replace.ToCharArray();

            foreach (var car in value)
            {
                if (count % 3 == 0)
                {
                    endResult = String.Concat(endResult, car);
                    if (value.Length != count)
                    {
                        endResult = String.Concat(endResult, ",");
                    }
                    count++;
                }
                else
                {
                    endResult = String.Concat(endResult, car);
                    count++;
                }
            }
            if (endResult == null) return;
            string textBoxResult = Reverse(endResult);
            textBox.Text = textBoxResult;
        }

        public static string Reverse(string stringVal)
        {
            char[] charArray = stringVal.ToCharArray();
            Array.Reverse(charArray);
            return new string(charArray);
        }

        public static void IsDeleteKey(TextBox textBox, KeyEventArgs e)
        {
            textBox.SelectionStart = e.Key == Key.Delete ? 0 : textBox.Text.Length;
        }
    } 

事件处理程序,

private void TextBoxOne_OnKeyUp(object sender, KeyEventArgs e)
{
    BonusData.DoDataTextBox.AutoCompleteStringBuild((TextBox)sender);
    BonusData.DoDataTextBox.IsDeleteKey((TextBox)sender, e);
}   

目前,这是我发现的最佳方式。