在WebBrowser获得焦点后,重新获取键盘事件

时间:2011-10-12 02:16:36

标签: c# wpf xaml webbrowser-control

我有一种情况,我想要使用WFP 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);
    }
}

好的,用户可能想要输入他的Google查询。但在某些时候我想要控制回来。为此,我设计了一个按钮。当您单击此按钮时,我希望键盘控制返回到WPF应用程序。但无论按钮做什么,我都无法再次点击OnKeyDown()

我的特殊限制允许在此时销毁WebBrowser。我尝试清除其父容器,尝试调用Dispose()和垃圾收集器。尝试Focus()具有该功能的事物。似乎什么都没有得到控制。

我宁愿避免使用创建新Window()的解决方案或其他类似的解决方案。

修改

我发现放TextBox并使其聚焦让我重新回到焦点!但是我的窗口中没有文本框,只为咯咯补充添加一个文本框似乎反直觉。

编辑2

当前的临时解决方案使隐形(好吧,有点,它只是0乘0,Visibility.Hidden不起作用)TextBox - 启用它,聚焦它并禁用它。如果不首先禁用它,某些键会由TextBox处理,而不是冒出KeyDown()

1 个答案:

答案 0 :(得分:1)

是的,它仅对Enter密钥具有可重现性,修复方法是对Enter密钥使用OnKeyUp()....

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