WPF:焦点未在Usercontrol中正确传输

时间:2012-04-03 08:34:00

标签: wpf user-controls focus

我创建了一个用户控件并设置了 Focusable =“True”。此用户控件具有以下按钮

<Button Grid.Column="1" Name="btnPreviousClip" Focusable="True"  Template="{StaticResource controlButtonStart}"  Margin="2,2,2,4" Click="btnReverse_Click" KeyboardNavigation.TabIndex="0" KeyDown="btnPreviousClip_KeyDown" />
<Button Grid.Column="2" Name="btnReverse" Focusable="True"  Template="{StaticResource controlButtonReverse}"  Margin="2,2,2,4" Click="btnReverse_Click" KeyboardNavigation.TabIndex="1" KeyDown="btnReverse_KeyDown" />
<Button Grid.Column="3" Name="btnPlay" Focusable="True"  Template="{StaticResource controlButtonPlay}"  Click="btnPlay_Click" Margin="2,2,2,4" KeyboardNavigation.TabIndex="2" KeyDown="btnPlay_KeyDown" />
<Button Grid.Column="3" Name="btnPause" Focusable="True"  Template="{StaticResource controlButtonPause}" Margin="2,2,2,4" Visibility="Hidden" Click="btnPause_Click" KeyboardNavigation.TabIndex="3" KeyDown="btnPause_KeyDown" />
<Button Grid.Column="4" Name="btnForward" Focusable="True" Template="{StaticResource controlButtonForward}"  Margin="2,2,2,4" Click="btnForward_Click" KeyboardNavigation.TabIndex="4" KeyDown="btnForward_KeyDown" />
<Button Grid.Column="5" Name="btnNextClip" Focusable="True" Template="{StaticResource controlButtonEnd}"  Margin="2,2,2,4" Click="btnForward_Click" KeyboardNavigation.TabIndex="5" KeyDown="btnNextClip_KeyDown" />

<Button Grid.Column="7" Name="btnFav" Focusable="True" Template="{StaticResource controlButtonFav}"  Margin="2,2,2,4"  KeyboardNavigation.TabIndex="6" Click="btnFav_Click" KeyDown="btnFav_KeyDown" />
<Button Grid.Column="8" Name="btnResize" Focusable="True" Template="{StaticResource controlButtonResize}"  Margin="2,2,2,4" Click="btnResize_Click" KeyboardNavigation.TabIndex="7" KeyDown="btnResize_KeyDown" />

我也写了这个usercontrol的焦点事件,如下所示

private void UserControl_GotFocus(object sender, RoutedEventArgs e)
        {

            Keyboard.Focus(btnPlay);
        }

上面的代码效果很好,焦点设置为 btnplay 。但现在如果我按Tab键,则焦点转移到usercontrol之外(代替 btnForward )。我经常尝试找出问题并进行大量的谷歌搜索,但直到现在还没有运气。

在这里,我想通知一旦我按空格键的任何按钮,然后标签顺序(焦点)效果很好。

请建议我做错了。

1 个答案:

答案 0 :(得分:0)

如果没有看到为按钮指定的ControlTemplates代码,就很难更彻底地回答这个问题。

您应该为UserControl设置KeyboardNavigation.TabNavigation="Local",并删除其Focusable="True"。这样,您为UserControl中的按钮指定的TabIndex属性仅在本地范围内考虑,并且一旦具有最高Tabindex的按钮控件(btnResize),焦点将从UserControl移动到父容器内的下一个合适元素)一直专注。

请注意,每次焦点更改发生时都会引发GotFocus事件。因此,拥有此事件处理程序将有效地阻止您在UserControl内切换焦点:一旦引发,焦点总是恢复为播放按钮。您应该删除事件处理程序。