2011-10-12 54 views
1

我有一種情況,我想使用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()

回答

1

是的,它是可重複的只有Enter鍵和解決方法是使用的onkeyup()爲Enter關鍵....

protected override void OnKeyUp(KeyEventArgs e) 
    { 
     if (e.Key == Key.Enter) MessageBox.Show("Hi"); 
     base.OnKeyUp(e); 
    }