KeyPressed Event - PullRequest
       19

KeyPressed Event

2 голосов
/ 07 апреля 2010

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

Ответы [ 5 ]

4 голосов
/ 07 апреля 2010

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

0 голосов
/ 07 апреля 2010

Я создаю 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
0 голосов
/ 07 апреля 2010

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

0 голосов
/ 07 апреля 2010

bool isIncrement = true;

keyDown Execute Method:

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;
    }
}

keyUp Execute Method:

isIncrement = false;
0 голосов
/ 07 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...