如何从按钮中移除焦点,以便按空格键或Enter键不会触发按钮?

时间:2015-04-12 04:09:36

标签: windows-runtime

当您单击或点击某个按钮时,它会使其聚焦,这样当您按空格键或按Enter键时,它会再次触发该按钮。我不希望这种情况发生。 我试过这个:button1.Focus(Windows.UI.Xaml.FocusState.Unfocused); 但是仍然会发生不需要的行为(按空格键或Enter键再次触发按钮)。我也尝试使用Programmatic和Keyboard FocusStates将焦点设置到另一个按钮,但也没有修复它。

任何帮助,尤其是解释为什么会发生这种情况的行为,都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以将TabStop属性设置为False,但请注意,这样做会禁止用户通过键盘使用按钮。

 <Button Content="Click Me By Pointer!" IsTabStop="False"/>

<强>更新

正如msdn所述:

  

通过使用FocusState.Unfocused作为参数调用此方法,无法从控件中删除焦点。不允许使用此值并导致异常。要从控件中移除焦点,请将焦点设置为其他控件。

另一种实现此目的的方法是,当按钮即将通过指针获得焦点时,将焦点设置为先前聚焦的元素。不幸的是,GettingFocus事件不适用于Button类(也许是因为最终版本尚未发布?)所以我们应该使用GotFocus事件,它很难看,但是有效。

bool moveFocus = false;
public MainPage() {
    this.InitializeComponent();            
}
private void Button_Click(object sender, RoutedEventArgs e) {
    if (moveFocus) {
        UIElement focusedElement = FocusManager.FindNextFocusableElement(FocusNavigationDirection.Right);
        if (focusedElement is Control) {
            ((Control)focusedElement).Focus(FocusState.Programmatic);
        }
    }
}
private void Button_GotFocus(object sender, RoutedEventArgs e) {
    Button button = (Button)sender;
    moveFocus = (button.FocusState == FocusState.Pointer);
} 

请注意,我将FocusNavigationDirection.Right传递给FocusManager.FindNextFocusableElement以获取正确的元素,我应该使用FocusNavigationDirection.Previous而不是获取前一个元素,但它因未知原因返回null。