【问题标题】:How to force textbox to take only numbers in WPF?如何强制文本框在 WPF 中只接受数字?
【发布时间】:2011-05-11 16:09:49
【问题描述】:

我希望用户在TextBox 中只输入数值。

我得到了这个代码:

private void txtType1_KeyPress(object sender, KeyPressEventArgs e)
{
     int isNumber = 0;
     e.Handled = !int.TryParse(e.KeyChar.ToString(), out isNumber);
}

但我在使用 WPF 时没有收到 textbox_KeyPress 事件和 e.KeyChar

WPF 中的解决方案是什么?

Edit:

我提出了一个解决方案!

private void txtName_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    CheckIsNumeric(e);
}

private void CheckIsNumeric(TextCompositionEventArgs e)
{
    int result;

    if(!(int.TryParse(e.Text, out result) || e.Text == "."))
    {
        e.Handled = true;
    }
}

【问题讨论】:

  • 得到它真的很有帮助..它工作....
  • View here 你可以在这里找到一个很好的答案概述。

标签: c# .net wpf textbox


【解决方案1】:
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
    {
        char c = Convert.ToChar(e.Text);
        if (Char.IsNumber(c))
            e.Handled = false;
        else
            e.Handled = true;

        base.OnPreviewTextInput(e);
    }

【讨论】:

  • 好答案!虽然,我会用 e.Handled = !Char.IsNumber(Convert.ToChar(e.Text));
  • PreviewTextInput() 不会捕捉到“空格”键的按下。在PreviewKeyDown() 中添加if (e.Key == Key.Space) e.Handled = true; 可以解决这个问题。
  • 此答案不能解决用户将值粘贴到文本框中的问题。粘贴的值可以包含字母。
【解决方案2】:

您可以使用验证规则... http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

或者制作你自己的 Maskable 文本框 http://rubenhak.com/?p=8

【讨论】:

    【解决方案3】:

    您可以将您的文本框与依赖属性绑定,在依赖属性的验证方法中,您可以检查 int.tryparse 是否返回 true,否则您可以使用默认值,也可以重置值。

    或者您可以使用 WPF ValidationRules 找出值何时更改。更改后,您可以应用逻辑进行 inout 验证。

    或者您可以使用 IDataError Info 进行验证。

    【讨论】:

      【解决方案4】:

      Hasib Uz Zaman 的位增强版

           private void txtExpecedProfit_PreviewTextInput_1(object sender, TextCompositionEventArgs e)
          {
              CheckIsNumeric((TextBox)sender,e);
          }
      
          private void CheckIsNumeric(TextBox sender,TextCompositionEventArgs e)
          {
              decimal result;
              bool dot = sender.Text.IndexOf(".") < 0 && e.Text.Equals(".") && sender.Text.Length>0;
              if (!(Decimal.TryParse(e.Text, out result ) || dot )  )
              {
                  e.Handled = true;
              }
          }
      

      这将检查重复的 .(十进制标记),并且不允许只允许 .(十进制标记)

      【讨论】:

        【解决方案5】:
        //Call this code on KeyDown Event
        if((e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) || (e.Key == Key.Back))
        { e.Handled = false; }
        else if((e.Key >= Key.D0 && e.Key <= Key.D9))
        { e.Handled = false; }
        else
        { e.Handled = true; }
        

        【讨论】:

          【解决方案6】:

          在 WPF 中,keycode 值与普通 winforms e.keychar 值不同,

          在文本框的 PreviewKeyDown 事件中,添加如下代码:

          if ((e.key < 34) | (e.key > 43)) {
          if ((e.key < 74) | (e.key > 83)) {
              if ((e.key == 2)) {
                  return;
                  }
              e.handled = true;
              }
          }
          

          这将允许用户只在 Numpad0 - Numpad9 部分和 D0 - D9 以及 key.Back 中输入数字。返回

          希望对您有所帮助,干杯!

          【讨论】:

          • 不能与 Shift 结合使用。可以插入特殊字符
          【解决方案7】:
          private void shomaretextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
          {
            // xaml.cs code
            if (!char.IsDigit(e.Text, e.Text.Length - 1))
              e.Handled = true;
          }
          

          在xml中

          <TextBox x:Name="shomaretextBox" 
                   HorizontalAlignment="Left" 
                   Height="28" 
                   Margin="125,10,0,0" 
                   TextWrapping="Wrap" 
                   VerticalAlignment="Top" 
                   Width="151" 
                   Grid.Column="1"        
                   TextCompositionManager.PreviewTextInput="shomaretextBox_PreviewTextInput" />
          

          【讨论】:

          • 如果你能添加一些解释,圆顶细节,而不仅仅是代码,那就更好了。这个想法是其他用户也可以从您的答案中受益(将来),而不仅仅是 OP。只是一个想法:)
          【解决方案8】:

          我相信您正在寻找的是PreviewTextInput 事件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-09
            • 2022-06-28
            • 2010-10-02
            • 1970-01-01
            • 2011-06-15
            • 2012-02-19
            • 2015-12-30
            相关资源
            最近更新 更多