2010-12-03 60 views
8

我試圖在我的WPF應用程序中的任何位置捕獲按鍵事件,而不管哪個UI元素具有焦點。目前我沒有運氣。任何人都可以提出一些我可能沒有嘗試過的策略嗎?或者,理想情況下,提供一個答案,如「哦,這很容易,你只是這樣做」。WPF應用程序廣泛捕獲關鍵的向上/向下事件

這是一個分佈式應用程序,它有一個聊天系統。我正在尋找的效果是,用戶可以隨時開始輸入聊天消息,而無需切換到標準聊天框。我將使用FormattedText對象自己在應用程序中顯示它們的消息。這很重要,因爲這意味着應用程序中沒有任何文本輸入元素。

我的XAML結構大體類似:

<MainWindow> 
    <Canvas 1> 
    <Canvas 2> 
     <Image 1 /> 
    </Canvas 2> 
    <Image 2 /> 
    </Canvas 1> 
</MainWindow> 

我編程方式添加元素融入帆布2,和操作圖片2,這就是爲什麼它有一個結構。我已經嘗試將KeyDown,KeyUp和預覽事件添加到MainWindow和Canvas 1,但它們都不會觸發(我檢查斷點)。在閱讀了另一個相關的問題之後,我也嘗試在Loaded()方法中手動設置主窗口的焦點。

我知道有這個網站的許多相關的問題,但他們並沒有幫助我,因爲:

  • 沒有任何答案(將我的問題回答?)
  • 他們承擔文本輸入小部件,並有興趣在冒泡事件
  • 他們想要一個鍵的少量鍵 - 我想捕獲任何鍵
  • 他們有興趣檢測控制/ shift/alt鍵是否關閉後他們已經捕獲了事件

感謝您花時間閱讀我長篇大論的帖子,並感謝您的建議。

更新(在Rachel的評論之後)當我放入一個TextBox並將焦點設置到TextBox中時,MainWindow級別上的一個關鍵事件方法將會觸發。因此,它可以像廣告一樣工作。

但是,我真的很想在應用程序中沒有明確的文本輸入小部件。我希望用戶能夠開始輸入以撰寫郵件。

+0

另請參見我的答案在這裏:http://stackoverflow.com/a/42484932/2025364 – 2017-02-27 11:45:00

回答

2

我通常會向MainWindow添加一個PreviewKeyDown事件。

也許你的問題是你沒有任何控件接受鍵盤焦點在你的應用程序。如果將一個TextBox添加到MainWindow並在那裏設置焦點,你會得到相同的結果嗎?

+0

這的確行得通(在TextBox中添加,在MainWindow中將PreviewKeyDown添加到TextBox,按下一個鍵)。我正在更新主帖以說。但是,如果可能的話,我想避免在應用程序中使用TextBox。你關於某些控件不接受鍵盤焦點的觀點很重要。有什麼方法可以強制非textentry控件的鍵盤焦點? – cursa 2010-12-03 17:36:53

5

修修補補的一點點讓我這個:

XAML:

<Window x:Class="KeyInput.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="100" Width="225"> 
    <Canvas> 
     <Grid> 
      <Label Name="test" Content="Empty" /> 
     </Grid> 
    </Canvas> 
</Window> 

CS:

using System.Windows; 
using System.Windows.Input; 

namespace KeyInput 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.KeyDown += new KeyEventHandler(OnButtonKeyDown); 
     } 

     private void OnButtonKeyDown(object sender, KeyEventArgs e) 
     { 
      test.Content = test.Content + e.Key.ToString(); 
     } 
    } 
} 

這種打印出的東西,如 「移位」 所以你顯然必須使用開關...但它有一個收集按鍵的文本框。

3

我設法解決了這個問題,靈感來自於RachelWernerCD的回答。正如他們都證明的那樣,在MainWindow級別捕獲事件是行得通的。問題在於我忽略了提到在加載MainWindow之前我有一個對話框,這似乎干擾了MainWindow上的正常鍵盤焦點。在Loaded()方法中放入顯式的Keyboard.focus()過早。我通過在MainWindow_ContentRendered()方法中放入Keyboard.focus()來解決該問題。

現在一切正常(直到下一期無論如何)。感謝您的幫助。

相關問題