2014-06-27 146 views
2
private void StartDate_LostFocus(object sender, RoutedEventArgs e) 
{ 
    if (!validate()) 
    { 
     Dispatcher.BeginInvoke(
     DispatcherPriority.ContextIdle, 
     new Action(delegate() 
     { 
      StartDate.Focus(); 
     }) 
    }); 
} 

我正在驗證WPF應用程序的文本框丟失焦點中的日期。目前,我做了一些日期驗證 - 如果驗證失敗,我將焦點重置到文本框。這是正確的方法嗎?WPF窗體驗證

它似乎工作正常,我希望我不創建任何問題或內存泄漏與BeginInvoke。

在此先感謝

+0

這個工程,但沒有多大意義,對我來說。您正在同步執行UI線程中的實際驗證(阻塞UI線程),然後您將焦點移至BeginInvoke(仍爲UI線程,但是是異步)的StartDate控件。你確定這是你的目標嗎? –

+0

我想說的是,由於您已經在UI線程中同步驗證,所以沒有必要異步執行Focus()方法。在UI線程中也是如此。我會建議做的異步驗證(用戶界面或,最好在不同的線程),然後在UI線程中同步設置焦點。 –

+1

我推薦看看['IDataErrorInfo'](http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo.aspx)和['INotifyDataErrorInfo'](http:// msdn。 microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo(v=vs.110).aspx)以獲得更多標準的WPF驗證方法。 –

回答

0

ADI公司建議,請考慮使用更常見的方法進行驗證。但是,如果你正在工作的應用程序的東西只是爲了好玩,或只是去了解WPF是如何工作的,請考慮:

  1. 驗證異步
  2. 同步在UI線程與UI交互

此外,失去焦點之前驗證(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(); 
    } 
+0

謝謝你的回覆。我選擇了lostCocus而不是textChange事件,因爲我認爲這個驗證會在每個關鍵筆畫上觸發...也就是說,對於今天 - 0 validate()6 validate()2 validate()8 validate()等。是否有任何問題接着就,隨即? –

+0

我不這麼認爲,真的。那麼,答案是非常具體的你的驗證的上下文,例如它如何影響用戶體驗,所以你必須自己回答。然而,從純粹的技術角度來看,這就是驗證應該工作的方式 - 在幕後進行驗證,然後在UI線程中更新UI。我相信這是你的原始問題。 –

+0

謝謝你的幫助。 –