1

我的 WPF 应用程序中有一个简单的弹出窗口。此弹出窗口中有一个带有访问键的按钮。

我遇到的问题是这个按钮不响应 Alt+access-key 组合。此外,按 Alt 不会像在普通窗口中那样使访问键可见。

有什么方法可以让弹出窗口中的控件响应 Alt+access-key 组合?

PS 我对通过此弹出窗口使用 Tab 进行导航没有问题。

我正在使用的样本代码

     <Grid>
        <Button Click="ButtonBase_OnClick" Content="_Open File"></Button>
        <Popup x:Name="Popup" StaysOpen="False">
            <Grid Background="White">
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Button Content="_Open File"/>
                <Button Grid.Row="1" Content="O_pen File"/>
                <CheckBox Grid.Row="2" Content="_Go"></CheckBox>
            </Grid>
        </Popup>
    </Grid>
    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
      Popup.IsOpen = true;
    }

正如第一个答案所暗示的那样,我也尝试过添加这个

    private void Popup_OnOpened(object sender, EventArgs e)
    {
      var popup = sender as Popup;
      popup.Child.Focusable = true;
      Keyboard.Focus(popup.Child);
    }

我也尝试了第一条评论的想法

    private void Popup_OnOpened(object sender, EventArgs e)
    {
      var popup = sender as Popup;
      FocusManager.SetIsFocusScope(popup, true);
    }

或者使用建议的链接codeproject.com/Articles/38507/Using-the-WPF-FocusScope代替标准焦点范围

   EnhancedFocusScope.SetFocusOnActiveElementInScope(popup);

设置焦点范围有点帮助,但我没有设法让它完全按照我的意愿工作。将焦点范围设置为 true 确实有助于将 alt+key 组合用于复选框和标签+文本框,但不适用于按钮。虽然我可以使用 Alt+access 组合键,但我实际上看不到它们,因为按下 Alt 时没有出现下划线

4

2 回答 2

1

Popup不是可视化树的一部分。这意味着它有自己的孤立焦点范围。当Popup打开 a 时,Popup.Child它托管在一个专用Window的具有自己分离的可视化树中。因此Popup.Child,在分离的焦点范围内访问键可用之前,需要显式接收键盘焦点。

您可以Popup.Opened在代码隐藏中或使用附加行为来处理事件。为了获得键盘焦点,
它必须是可聚焦的。 默认情况下,某些类(如及其子类)已设置为。Popup.Child
PanelUIElement.Focusablefalse

<StackPanel>
  <ToggleButton x:Name="ToggleButton" Content="Show Popup" />
  <Popup x:Name="Popup" 
        AllowsTransparency="True"  
        PlacementTarget="{Binding ElementName=ToggleButton}" 
        IsOpen="{Binding ElementName=ToggleButton, Path=IsChecked}" 
        Opened="Popup_OnOpened">
    <StackPanel>
      <Button Grid.Row="1" Content="O_pen File" />
      <CheckBox Grid.Row="2" Content="_Go" />
    </StackPanel>
  </Popup>
</StackPanel>

private void Popup_OnOpened(object sender, EventArgs e)
{
  var popup = sender as Popup;
  popup.Child.Focusable = true;
  Keyboard.Focus(popup.Child);
}
于 2020-09-10T19:27:21.127 回答
0

一旦弹出窗口内的按钮或复选框获得焦点,alt-shortcuts 就会起作用。

<Button Click="ButtonBase_OnClick" Content="_Open File" />
<Popup x:Name="Popup">
    <StackPanel Background="White">
        <CheckBox x:Name="FirstCeckbox" Content="_Foo" />
        <CheckBox Content="_Bar" />
    </StackPanel>
</Popup>

后面的代码:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    Popup.IsOpen = !Popup.IsOpen;
    if (Popup.IsOpen)
        FirstCeckbox.Focus();  // Make sure to focus a Button or a Checkbox, not the Stackpanel or Grid etc.
}
于 2020-09-11T19:03:31.653 回答