UWP:Button中的TextBox,如何防止SpaceBar触发Click事件?

时间:2018-06-01 18:55:54

标签: c# button uwp textbox

我想把一个TextBox,一个Label和一个SymbolIcon放到一个Button中,这样整个东西都是可点击的。在开始时,您只能看到标签和符号。通过单击按钮,标签将被隐藏,并出现textBox,您可以在其中键入一些文本。通过再次单击,标签将再次出现,并输入新的文本,TextBox将消失。

我的问题是,通过将焦点设置为TextBox,按钮(父级)似乎也会聚焦,因为每次按空格键时,按钮的Click事件都会触发。我不希望这发生,而TextBox有焦点。

XAML

    <Button Click="ToggleTopic"
            HorizontalAlignment="Stretch"
            HorizontalContentAlignment="Stretch">
        <Grid>                                            
            <TextBlock x:Name="textBlockInfoTopic" 
                       Text=""
                       HorizontalAlignment="Left"
                       Margin="100,0,100,0"/>
            <TextBox x:Name="textBoxTopic" 
                     PlaceholderText="enter Topic..."
                     HorizontalAlignment="Stretch"
                     Margin="100,0,100,0"
                     Visibility="Collapsed"/>

            <SymbolIcon x:Name="symbolTopicButton" 
                        Symbol="Add"
                        HorizontalAlignment="Right"/>
        </Grid>
    </Button>

C#

private void ToggleTopic(object sender, RoutedEventArgs e)
        {
            if (textBoxTopic.Visibility == Visibility.Visible)
            {
                //non edit mode
                textBoxTopic.Visibility = Visibility.Collapsed;
                textBlockInfoTopic.Visibility = Visibility.Visible;
                symbolTopicButton.Symbol = Symbol.Add;
                textBlockInfoTopic.Text = textBoxTopic.Text;
            }
            else
            {
                //edit mode
                textBoxTopic.Visibility = Visibility.Visible;
                textBoxTopic.Focus(FocusState.Programmatic);
                textBlockInfoTopic.Visibility = Visibility.Collapsed;
                symbolTopicButton.Symbol = Symbol.Go;
                textBlockInfoTopic.Text = "";
            } 
        }

我只想阻止通过spaceBar触发事件。返回键应该触发事件。

感谢您的帮助!

d

1 个答案:

答案 0 :(得分:1)

来自官方文件,

  

如果按钮具有键盘焦点,则按 Enter 键或 Space 键也会引发Click事件。您通常无法处理Button上的低级PointerPressed事件,因为它具有Click行为。

如果您想阻止SpaceBar触发Click事件,您可以覆盖按钮的OnProcessKeyboardAccelerators方法,如下所示。

public class MyButton : Button
{

    protected override void OnProcessKeyboardAccelerators(ProcessKeyboardAcceleratorEventArgs args)
    {

        if(args.Key == VirtualKey.Space)
        {
            args.Handled = true;
        }
        base.OnProcessKeyboardAccelerators(args);
    }

}

<强>用法

<local:MyButton Click="ToggleTopic"  
    HorizontalAlignment="Stretch"
    HorizontalContentAlignment="Stretch">
    <Grid IsTapEnabled="False" >
        <TextBlock x:Name="textBlockInfoTopic" 
               Text=""
               HorizontalAlignment="Left"
               Margin="100,0,100,0"/>
        <TextBox x:Name="textBoxTopic" 
             PlaceholderText="enter Topic..."
             HorizontalAlignment="Stretch"
             Margin="100,0,100,0"
             Visibility="Collapsed"/>

        <SymbolIcon x:Name="symbolTopicButton" 
                Symbol="Add"
                HorizontalAlignment="Right"/>
    </Grid>
</local:MyButton>