2010-04-07 4 views
2

Mon problème est que je veux vérifier si la touche Flèche haut ou bas est enfoncée puis je veux incrémenter ou décrémenter la valeur dans le contrôle de la zone de texte. J'ai enregistré l'événement keyup mais je dois relâcher la touche fléchée vers le haut pour changer la valeur, ce que je veux est si l'utilisateur appuie sur la touche fléchée alors il incrémentera la valeur jusqu'à ce que l'utilisateur lève la flèche et même pour la touche fléchée . Une idée?Evénement KeyPressed

Répondre

4

au lieu d'utiliser l'événement KeyUp vous devez prendre l'événement KeyDown. Cela sera également envoyé plusieurs fois si vous maintenez simplement la touche.

0

Avez-vous essayé registrering l'événement KeyDown pour le réglage du drapeau, puis l'événement KeyUp pour MHS le drapeau?

0

bool isIncrement = true;

KEYDOWN Exécuter Méthode:

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 Méthode:

isIncrement = false; 
+0

merci pour votre code, mais je une recherche pour tous les événements de l'équipe de WPF comme keydown et keyUp event like, cela veut dire qu'il y a un tel événement pour le contrôle. qui peut me dire n'importe quelle touche est pressée? –

0

Êtes-vous sûr que vous voulez juste un RepeatButton de WPF? qui a cette fonctionnalité dans ce

+0

Je crée moi-même, je veux juste quand la zone de texte est mise au point puis en appuyant sur la touche fléchée haut et bas, il va augmenter et décrémenter. mais le problème est keyup et keydown, qui se déclenche une fois pour chaque touche. –

0

je crée un NumericTextBox avec boutons haut et bas en utilisant cette technique.

En XAML vous avez quelque chose comme:

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

Dans le code derrière (pour un maximum/augmentation partie):

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