2015-01-07 95 views
0

的LostFocus事件这是我的XAML结构WPF文本框

<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> 
<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(); 
} 

问题:如果有> = 2的文本框具有值是空的(” “)。

  1. 我点击第一个空文本框=>我不输入任何字符。
  2. 然后,我单击第二个空的文本框。

==>程序总是显示消息框=>如果我点击确定按钮,它会显示另一个。它永远发生。我无法关闭该程序。

问题如果我有> = 2的空文本框,并且我的问题与上面的问题相同。如何更改功能text_LostFocus来解决问题?

DEFAULT:这些文本框的

  • 值始终是空的(DEFAULT

  • 必须使用的BeginInvoke =>因为我想,当用户点击texbox,用户必须输入至少一个角色。

+2

滑稽实现XD当你有两个文本框,以为发生了什么事的: 否则我将创建一个“警告”标签靠近每个文本框1 。你输入第一个tb 2.你不输入任何东西,然后你点击第二个3. tb1的lostfocus事件触发,它打开一个对话框,再次关注tb1 4.因为tb1获得焦点,tb2的lostfocus事件触发它也是这样做的,将焦点返回到tb2并以无限循环继续。 –

+1

另外 - 不需要'BeginInvoke'。您已经在UI线程中。 –

+0

我以为这是WPF而不是WinForms,这个'System.Windows.Forms.DialogResult'可以很容易地用'System.Windows.MessageBox'代替! – XAMlMAX

回答

1

如果我是你,我就不会使用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; 
}