2017-07-25 46 views
0

在我Xamarin窗體應用程序我有一個Entry視圖用於輸入文本的頁面。我已經連接好了TextChanged事件,以便在用戶輸入文本的UI動態更新,我想更新UI堅持,如果用戶按下Enter鍵(即Completed事件被觸發),但恢復是怎麼回事之前,如果用戶退出視圖(即Unfocused事件被觸發,但不是Completed事件)。如何檢測用戶退出文本輸入而不按輸入Xamarin Forms?

的這裏複雜之處在於 - 至少在Android上 - Xamarin首先觸發Unfocused事件(在這兩種情況下)和然後Completed事件(僅在用戶按輸入的情況下)。所以很難確切地知道何時恢復UI更改。這對我來說是違反直覺的:當我按下Enter鍵時,視圖顯然仍然有焦點,所以在Completed之前先調用Unfocused沒有任何意義。

有些事情我已經試過,我不快樂:

  • 裏面的Unfocused事件處理程序,啓動一個定時器爲200ms,如果Completed事件還沒有被再發生以爲它不會並恢復用戶界面(似乎不可靠,200毫秒是完全武斷的)。
  • 總是在Unfocused事件中恢復UI,然後在接收到事件(如醜陋,導致UI閃爍,性能不佳)時重新應用Completed事件中的更改。
  • 上述的一些組合,e.g:如果之後所接收Completed啓動一個定時器,然後200毫秒後的恢復UI的變化,但重新應用它們,或者如果它在此之前(變得有點複雜)接收取消計時器。

什麼是做到這一點的正確方法?

+1

[A類似的問題](https://forums.xamarin.com/discussion/87705/switching-focus-is-broken-in-entry-completed-event-handler)。但我不認爲它有一個妥善的解決辦法 – Curiousity

+1

[該解決方案(https://stackoverflow.com/a/41521517/7196681),[這](https://forums.xamarin.com/discussion/55183/ done-button-not-firing-completed-event-on-entry)和[this](https://stackoverflow.com/a/39582265/7196681)可能會有所幫助 – Curiousity

回答

1

改變你的計時器的建議一點點。 「entryFocus」是一個條目名稱。

CancellationTokenSource source; 
private void EntryFocus_Completed(object sender, EventArgs e) 
{ 
    try 
    { 
     source.Cancel(); 
    } 
    catch { } 
} 

async private void EntryFocus_Unfocused(object sender, FocusEventArgs e) 
{ 
    source = new CancellationTokenSource(); 
    try 
    { 
     await Task.Delay(500, source.Token); 
    } 
    catch (TaskCanceledException) //completed event requested cancelation 
    { 
     return; 
    } 
    catch { } //something is wrong 
    entryFocus.Text = ""; 
}