2012-02-27 165 views
3

我正在開發WPF觸摸應用程序的屏幕上的數字鍵盤。這將出現在Popup中。當按下按鈕時,它應該向應用程序發送按鍵,使其看起來好像用戶正在輸入TextBox。這是我的代碼:在WPF中模擬按鍵

// 'key' is set beforehand 
InputManager.Current.ProcessInput(new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, Environment.TickCount, key) { RoutedEvent = Control.KeyDownEvent }); 

這是在Button.Click事件處理程序中調用的。

到目前爲止,只有Key.Back工作過。沒有任何數字鍵可以工作,也沒有Key.Decimal

編輯:我想用SendKeys可以解決這個問題,但它只是做同樣的事情。

爲什麼我的數字按鈕的工作?我已經驗證了正確的Key正在通過。

+1

數字鍵盤上的按鍵可能與頂部行有不同的鍵。這是一個未經測試的評論 - 不是答案。 – Paparazzi 2012-02-27 17:21:59

+0

@BalamBalam:頂部行和數字鍵都不能與代碼一起使用。兩者都在物理鍵盤上工作。 – 2012-02-27 17:27:16

+0

這聽起來像是一種迂迴的實現方式。你能不能在第三方助手類中實現所有的按鍵功能,並獲得彈出鍵盤或鍵盤輸入? – 2012-02-27 17:31:57

回答

0

繼我們在意見的討論,我建議你考慮這樣的方法。我不知道完整的要求,但將功能分開並使應用程序更加單一,總是一個好方法!

首先是,僞UML圖將是這樣:

UserControl1.InsertCharacter(string character) 
{ 
    textBox1.Text = textBox1.Text.Insert(textBox1.CaretIndex, character); 
    this.ValidateInput(); 
} 

UserControl1.ValidateInput() 
{ 
    // Perform validation 
} 

UserControl1.OnKeyDown() 
{ 
    // Perform validation 
    this.ValidateInput(); 
} 

UserControl2.AppendCharacter(string clickedCharacter) 
{ 
    this.userControl1.InsertCharacter(clickedCharacter); 
} 

要從的UserControl1進一步解耦UserControl2:

Class depedendency diagram

你的三個功能將如下(僞代碼)來實現正如我所提到的,您可以使用事件模式,如.NET事件或EventAggregator。

+0

感謝您的好解答。我仍然在尋找一種簡單按下按鍵的方法,但如果找不到,我會接受。 – 2012-02-27 21:04:37

+2

我確定有一個,我會研究UIAutomation框架,因爲這可以模擬鼠標/鍵輸入(主要用於自動化測試)。然而,我試圖提出的一點是,如果可能的話,它很好地避免這種情況,並將邏輯從視圖交互中移出,並轉移到代碼隱藏中的特定函數中,或者更好地移入MVVM應用程序中的ViewModels中 – 2012-02-27 21:09:50

0

看看http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b657618e-7fc6-4e6b-9b62-1ffca25d186b/。 WPF文本框有處理某些鍵的問題。

從文章:

var eventArgs = new TextCompositionEventArgs(Keyboard.PrimaryDevice, 
new TextComposition(InputManager.Current, Keyboard.FocusedElement, key)); 
eventArgs.RoutedEvent = TextInputEvent; 

InputManager.Current.ProcessInput(eventArgs); 
+0

'TextComposition'構造函數期望爲最後一個參數提供一個字符串,而不是'Key' – 2012-02-27 18:43:00