Событие нажатия клавиши

#c# #wpf

#c# #wpf

Вопрос:

Моя проблема в том, что я хочу проверить, нажата ли клавиша со стрелкой вверх или вниз, затем я хочу увеличить или уменьшить значение в элементе управления textbox. Я зарегистрировал событие нажатия клавиши, но мне нужно отпустить клавишу со стрелкой вверх, чтобы изменить значение, я хочу, чтобы, если пользователь нажал клавишу со стрелкой вверх, значение увеличивалось до тех пор, пока пользователь не отпустит клавишу со стрелкой вверх и то же самое для клавиши со стрелкой вниз. Есть идеи?

Ответ №1:

Вместо использования события KeyUp вам следует использовать событие KeyDown. Это сообщение также будет отправлено несколько раз, если вы просто будете удерживать клавишу.

Ответ №2:

Вы пробовали регистрировать событие KeyDown для установки флага, а затем событие KeyUp для снятия флага?

Ответ №3:

bool isIncrement = true;

Метод выполнения keyDown:

 StopWatch s = StopWatch.StartNew();
int timeInterval = 500; // for 0.5 second
i=1;
while(1)
{
    if((int)s.ElapsedMilliseconds / timeInterval < i   )
        continue;
    if(isIncrement)
    {
        //increment value
    }
    else
    {
        s.Stop();
        return;
    }
}
  

Метод выполнения нажатия клавиши:

 isIncrement = false;
  

Комментарии:

1. спасибо за ваш код, но я ищу любые события от команды wpf, такие как событие keydown и keyUp, например, имеется ли какое-либо подобное событие для управления. который может сообщить мне, что нажата какая-либо клавиша?

Ответ №4:

Вы уверены, что хотите просто RepeatButton WPF? в котором есть эта функциональность

Комментарии:

1. Я создаю свое собственное, я просто хочу, чтобы текстовое поле было в фокусе, затем, нажимая клавиши со стрелками вверх и вниз, оно увеличивалось и уменьшалось. но проблема заключается в вводе и выключении клавиш, которые срабатывают один раз при каждом нажатии клавиши.

Ответ №5:

Я создаю NumericTextBox с кнопками вверх и вниз, используя эту технику.

В XAML у вас есть что-то вроде:

 <Button x:Name="bntUp"                                 
        Command="{x:Static local:IntegerTextBox.UpCommand}"
        Width="10" Grid.Row="0" Cursor="Hand"
        HorizontalAlignment="Right">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Margin="1" Background="{StaticResource UpArrowBrush}" />
        </ControlTemplate>
    </Button.Template>
</Button>
<Button x:Name="bntDown"                                 
        Command="{x:Static local:IntegerTextBox.DownCommand}"
        Width="10" Grid.Row="1" Cursor="Hand"
        HorizontalAlignment="Right">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Border Margin="1" Background="{StaticResource DownArrowBrush}" />
        </ControlTemplate>
    </Button.Template>
</Button>
  

В коде позади (для увеличения части):

  Private Shared _UpCommand As RoutedCommand
    Private Shared _DownCommand As RoutedCommand

    Public Shared ReadOnly Property UpCommand() As RoutedCommand
        Get
            Return _UpCommand
        End Get
    End Property

    Private Shared Sub InitializeCommands()

        _UpCommand = New RoutedCommand("UpCommand", GetType(IntegerTextBox))
        CommandManager.RegisterClassCommandBinding(GetType(IntegerTextBox), New CommandBinding(_UpCommand, AddressOf OnUpCommand))
        CommandManager.RegisterClassInputBinding(GetType(IntegerTextBox), New InputBinding(_UpCommand, New KeyGesture(Key.Up)))

    End Sub

    Private Shared Sub OnUpCommand(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)

        Dim itb As IntegerTextBox = TryCast(sender, IntegerTextBox)
        If itb Is Nothing Then Return
        itb.OnUp()

    End Sub

Protected Overridable Sub OnUp()

        Dim caretIndex As Integer = Me.CaretIndex

        Me.Value  = 1

        Me.GetBindingExpression(IntegerTextBox.TextProperty).UpdateSource()

        If caretIndex <= Me.Text.Length Then Me.CaretIndex = caretIndex Else Me.CaretIndex = Me.Text.Length

    End Sub