wpf Textbox的LostFocus事件

时间:2015-01-07 13:10:12

标签: c# wpf xaml

这是我的xaml结构

<StackPanel>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="A"
     LostFocus="text_LostFocus"/>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="B"
     LostFocus="text_LostFocus"/>
</StackPanel>

=&GT;这种结构可以循环更多。如:

<StackPanel>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="A"
     LostFocus="text_LostFocus"/>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="B"
     LostFocus="text_LostFocus"/>
</StackPanel>
<StackPanel>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="A"
     LostFocus="text_LostFocus"/>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="B"
     LostFocus="text_LostFocus"/>
</StackPanel>

在.cs文件中,我定义了事件丢失焦点,如下所示

private void text_LostFocus(object sender, RoutedEventArgs e)
{
   TextBox textbox = ((TextBox)sender);
   if (textbox.Text.Trim().Length == 0)
   {
      System.Windows.Forms.DialogResult result1 = System.Windows.Forms.MessageBox.Show("Empty string!", "Warning",
                 System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
                textbox.Dispatcher.BeginInvoke((Action)(() => { textbox.Focus(); }));
       return;
    }
    textbox.ScrollToHome();
}

问题:如果有&gt; = 2文本框的值为空(“”)。

  1. 我点击第一个空文本框=&gt;我没有输入任何字符。
  2. 然后我点击第二个空文本框。
  3. ==&GT;程序始终显示消息框=&gt;如果我单击确定按钮,它会显示另一个。它永远发生。我无法关闭该计划。

    问题如果我有&gt; = 2个空文本框,我就像上面的问题一样。如何更改函数text_LostFocus以解决问题???

    默认

    • 这些文本框的值始终为空(默认

    • 必须使用BeginInvoke =&gt;因为我想在用户点击texbox时,用户必须至少输入一个字符。

1 个答案:

答案 0 :(得分:3)

如果我是你,我不会使用MessageBox。 WPF有一个非常好的“绑定验证框架”(需要一个look here来获得一个非常好的教程)。 否则,我会在每个文本框附近创建一个“警告”标签:

<StackPanel>
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="A"
     LostFocus="text_LostFocus"/>
  <TextBlock Name="AWarning" Foreground="Red" />
  <m:TextBoxWithEllipsis IsEllipsisEnabled="True"
     Name="B"
     LostFocus="text_LostFocus"/>
  <TextBlock Name="BWarning" Foreground="Red" />
</StackPanel>

然后在代码隐藏中:

private void text_LostFocus(object sender, RoutedEventArgs e)
{
    TextBox textBox = ((TextBox)sender);
    TextBlock textBlock = FindName(String.Concat(textBox.Name, "Warning")) as TextBlock;
    textBlock.Text = String.IsNullOrWhiteSpace(textBox.Text) ? "Empty string!" : String.Empty;
}