UWP: TextBox внутри Button, как запретить SpaceBar вызывать событие Click? - PullRequest
0 голосов
/ 01 июня 2018

Я хочу поместить TextBox вместе с меткой и SymbolIcon в кнопку, чтобы все это можно было нажимать.в начале вы можете видеть только метку и символ.При нажатии на кнопку, метка скрывается и появляется текстовое поле, где вы можете ввести текст.При повторном нажатии метка снова появляется с новым введенным текстом, и текстовое поле исчезает.

Моя проблема в том, что при установке фокуса на текстовое поле кнопка (родитель) также, кажется, оказывается в фокусе, потому чтокаждый раз, когда вы нажимаете пробел, срабатывает событие нажатия кнопки.Я не хочу, чтобы это произошло, в то время как 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 = "";
            } 
        }

Я только хочу предотвратить запуск события черезПРОБЕЛ.Клавиша возврата должна вызвать событие.

Спасибо за помощь!

D.

1 Ответ

0 голосов
/ 04 июня 2018

Из официального документа

Если кнопка имеет фокус клавиатуры, нажатие клавиши Ввод или клавиши Пробел также вызывает событие Click.Как правило, вы не можете обрабатывать низкоуровневые события PointerPressed для кнопки, потому что вместо этого она имеет поведение Click.

Если вы хотите запретить SpaceBar запуск события Click, вы можете переопределить OnProcessKeyboardAccelerators метод Button, как показано ниже.

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...