2011-07-06 17 views
2

我們正在編寫基於WPF的應用程序,通常用於觸摸屏平板電腦。我們正在設計用戶界面以避免文本輸入,但有時候這是無法避免的。對於那些我們想要控制什麼時候彈出什麼類型的鍵盤來輸入的時候。按照慣例,是否可以在所有視圖的所有文本框上處理GotFocus事件?

我們可以創建一個基本自定義控件來添加適當的事件處理程序,但我想知道是否有一種方法可以按照約定來完成此操作。

我們爲我們的MVVM框架使用CaliburnMicro,並且因爲它支持約定定製,我開始研究ConventionManager.AddElementConvention<TextBox>(null, null, "GotFocus"),但調用它將取代任何現有的約定。我想過類似的東西:

var textboxConvention = ConventionManager.GetElementConvention(typeof(TextBox)); 
var oldBinding = textboxConvention.ApplyBinding; 
textboxConvention.ApplyBinding = 
    (viewModelType, path, property, element, convention) => 
     { 
      element.GotFocus += ((o, args) => ShowKeyboard((TextBox)o)); 
      element.LostFocus += ((o, args) => HideKeyboard((TextBox)o)); 
      return oldBinding(viewModelType, path, property, element, convention); 
     }; 

......但我懷疑我在這裏走錯了路。

有沒有更好的方法來鏈接綁定?有沒有更好的方式來處理焦點事件/調出鍵盤?

回答

1

我這樣做過。您可以創建一個attached behavior,在有問題的元素上監聽PreviewGotKeyboardFocus,使OnScreenKeyboard顯示。然後創建一個將附加行爲應用於這些控件的樣式。在我的項目中,我們對不同的輸入類型也有不同的鍵盤(例如文本和數字)。附加的行爲爲其屬性設置了KeyboardType。基於KeyboardType,我會顯示適當的鍵盤。

如果您需要進一步的幫助請告訴我。

+0

非常感謝,工作得很好。我沒有處理從一個控制切換到另一個控制的問題,在失去對舊的焦點之前,把重點放在新的控制火上。我會嘗試在RX中使用流。順便說一句我會對你使用的鍵盤感興趣,我們正在嘗試一些 – baralong

+0

是的,我必須處理這種情況......基本上我所做的訣竅是我在PreviewGotFocused事件中存儲了Current focus元素。當收到新的GotFocused事件時,我會與當前元素進行比較,如果不同的註銷舊元素上的丟失焦點事件。我想我們使用了一個自定義的鍵盤,但後來在codeplex上找到了很多內置的WPFKB。 –

1

我認爲GotFocus是一個冒泡事件,所以你可以添加一個處理程序到窗口或頁面,然後捕獲任何GotFocus事件冒泡到元素樹的頂部?然後,您可以適當地處理該事件,或者不處理它,並允許任何其他註冊處理程序處理它。我猜唯一的問題是如果TextBox處理併吞下事件,並且關閉我的頭頂我不確定。

HTH,

巴特

相關問題