2011-10-12 44 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); 
    }