2

问题

Lync 有一些热键/快捷键用于更改 ContactList 控件中的选项卡。这些热键是“g”、“s”和“r”。当我在任何网页上将 HTML 输入控件集中在 WebBrowser 内时按下这些键中的任何一个时,按键将转到 ContactList 控件而不是 WebBrowser 控件。在浏览器外部的控件(例如 WPF TextBox 控件)中键入时,按键不会被盗。

重现问题的步骤

  1. 已安装 Microsoft Lync 2013
  2. 从http://www.microsoft.com/en-au/download/details.aspx?id=36824下载并安装 Microsoft Lync 2013 客户端 sdk
  3. 创建一个 .net 4.0 wpf 应用程序。将 ContactList 控件拖放到 MainWindow 中,以便它自动设置引用和命名空间
  4. 将以下代码粘贴到 MainWindow.xaml 中的 Window 元素中

    <Window...
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <controls:ContactList Name="contactList1" Grid.Column="0" />
        <WebBrowser Grid.Column="1" Source="http://www.google.com"  />
    </Grid>
    

  5. 按“r”、“g”或“s”键进入 google 搜索框,注意按键是如何进入 lync 控件而不是搜索框的。任何其他键都可以正常工作。

我尝试过的事情

我试图阻止关键事件冒泡到 ContactList 控件。但是,我在这方面没有取得太大的成功。

禁用事件冒泡 c# wpf

WPF 防止事件在控件外冒泡

4

1 回答 1

1

在这里找到答案:AccessKey Pressed Event Raised when press access key without ALT

出现此行为是因为 WPF 不需要按住 alt 以使 AccessKeys 工作。正如 WinForms 所做的那样。在这种情况下,从 WebBrowser 中按“g”、“s”或“r”会聚焦 ClientControl,但我只希望在按住 alt 时发生这种情况。我不知道为什么这个问题似乎只发生在 WebBrowser 上。

从 msdn 链接:

我们在标签上定义了一个访问键,它将焦点放在一个文本框上。

我们在同一个用户控件上有第二个只读文本框。

在只读文本框内单击并按不带 ALT 的访问键(例如 L 而不是 ALT + L)时,无论如何都会完成焦点更改。

是否可以禁用此行为,即是否可以确保访问键仅在与 ALT 一起按下时才有效?

以下 xaml 显示了该问题:

<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
SizeToContent="Height"
Width="300" WindowStartupLocation="CenterScreen">
    <StackPanel Orientation="Vertical">
        <TextBox IsReadOnly="True" Text="ReadOnly - give focus and press l" />
        <Label Content="_Label:"  Target="{Binding ElementName=box}"/>
        <TextBox x:Name="box" />
    </StackPanel>
</Window>

解决方案

Menu 和 ToolBar menmonics 无需按 Alt 键即可工作。我们决定在所有情况下都将具有统一的行为,因此通过按 Alt 键即可访问键。

我知道这与 Forms 不一致,我们将考虑这个问题并在下一个版本中更改行为。

现在作为一种解决方法,您可以为所有 AccessKeyPressed 事件重新注册一个类处理程序,并在未按下 Alt 键的情况下处理该事件。

EventManager.RegisterClassHandler(typeof(UIElement), AccessKeyManager.AccessKeyPressedEvent, new AccessKeyPressedEventHandler(OnAccessKeyPressed));

private void OnAccessKeyPressed(object sender, AccessKeyPressedEventArgs e)
{
    if (!e.Handled && e.Scope == null && (e.Target == null || e.Target == label))
    {
        // If Alt key is not pressed - handle the event
        if ((Keyboard.Modifiers & ModifierKeys.Alt) != ModifierKeys.Alt)
        {
            e.Target = null;
            e.Handled = true;
        }
    }
}

我将解决方案代码添加到 MainWindow 类中,一切都按预期工作。

于 2013-05-02T23:44:56.517 回答