WPF表单验证

时间:2014-06-27 11:32:51

标签: wpf validation begininvoke

private void StartDate_LostFocus(object sender, RoutedEventArgs e)
{
    if (!validate())
    {
        Dispatcher.BeginInvoke(
        DispatcherPriority.ContextIdle,
        new Action(delegate()
        {
            StartDate.Focus();
        })
     });
}

我验证了WPF应用程序文本框丢失焦点的日期。目前,我做了一些日期验证 - 如果验证失败,我将焦点重置到文本框。这是正确的方法吗?

它似乎工作正常,我希望我没有使用BeginInvoke创建任何问题或内存泄漏。

提前致谢

1 个答案:

答案 0 :(得分:0)

正如Adi建议的那样,请考虑使用更常用的验证方法。但是,如果您正在处理的应用程序只是为了好玩或只是为了了解WPF的工作原理,请考虑:

  1. 异步验证
  2. 在UI线程中同步与UI进行交互
  3. 此外,在失去焦点之前进行验证(TextChanged可能是一个选项)。像这样:

        private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            TextBox validatedTextbox = sender as TextBox;
            validatedTextbox.IsEnabled = false;
    
            BackgroundWorker worker = new BackgroundWorker();
    
            worker.DoWork += (s, ea) => { Thread.Sleep(1000); }; // just to simulate really long validation
            worker.RunWorkerCompleted += (s, ea) =>
            {
                if (validatedTextbox.Text.Contains('a'))
                {
                    validatedTextbox.Background = new SolidColorBrush(Colors.Red);
                }
                else
                {
                    validatedTextbox.Background = new SolidColorBrush(Colors.Green);
                }
    
                validatedTextbox.IsEnabled = true;
            };
    
            worker.RunWorkerAsync();
        }