我有一種情況,我想使用WFP WebBrowser
,但當用戶按下按鈕某事發生;但在WebBrowser
獲得焦點後,某些鍵盤和鼠標事件不再在我的應用程序中觸發。獲取鍵盤事件後,WebBrowser獲取焦點
重現:創建一個新的項目,設置XAML:
<Window x:Class="ProblemKeyboard.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<WebBrowser x:Name="browser" Height="177" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top" Width="479" />
</Grid>
</Window>
,讓codebehide覆蓋OnKeyDown()
事件。
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
browser.Navigate("http://www.google.com");
//The above line causes browser to focus
//and as a consequence the OnKeyDown() handler
//doesn't get called again
}
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Key == Key.Enter) MessageBox.Show("Yey!");
base.OnKeyDown(e);
}
}
好的,可以理解的是,用戶可能想輸入他的谷歌查詢。但是在某個時候,我想要控制回來。爲此,我設計了一個按鈕。當你點擊這個按鈕時,我想讓鍵盤控制返回到WPF應用程序。但是無論按鈕是什麼,我都無法再讓OnKeyDown()
重新開火。
我的特殊限制允許WebBrowser
在此時被銷燬。我嘗試清除它的父容器,試圖調用Dispose()
和垃圾收集器。嘗試Focus()
具有該功能的東西。似乎沒有什麼能夠控制住了。
我寧願避免創建新的Window()
或其他方面的解決方案。
編輯
我發現,把一個TextBox
並使其專注讓我回來焦點!不過,我的窗口中沒有文本框,只是爲了咯咯笑而添加一個文本框似乎與直覺相反。
EDIT 2
當前的臨時解決方案提出一種無形的(嗯,有點,它只是0:0,Visibility.Hidden
不工作)TextBox
- 啓用它,它的重點並禁用它。在不禁用它的情況下,一些密鑰由TextBox
處理,而不是冒泡到KeyDown()
。