2017-12-22 6 views
4

Ich habe eine Schaltfläche in meinem WPF-Projekt und ich möchte es immer wieder ausführen, wenn ich die Taste gedrückt halte. Ich könnte RepeatButton verwenden, aber meine Präferenz wäre, dass der Befehl erneut ausgeführt wird, sobald er ausgeführt wurde (in seiner eigenen Task), anstatt sich auf die Delay- und Intervalleigenschaften des RepeatButton-Steuerelements zu verlassen.Taste gedrückt halten, um Befehle zu wiederholen

Ich hätte nichts dagegen, eine Button-Klick-Methode zu machen, aber die Befehlsaktion läuft lange und die Ausführungszeit hängt vom Wert des ExecuteParameters ab (in diesem Fall ein Doppel-Tupel, das eine physische Position einer Maschine darstellt) .

XAML:

<Button FontFamily="Marlett" FontSize="40" Content="5" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="100" Width="100" Height="50"        
     Command="{Binding IncrBAnglePos}" 
     CommandParameter="{Binding ElementName=slider, Path=Value}"> 
</Button> 

C#:

SystemCommands.AddSubSystemCommand(SystemRef, CommandNames.IncrAngle, new RelayCommand(    
     o => 
     { 
      double AngleIncr = (double)o > 5 ? 5 : (double)o; 
      double nextX = MotionControl.LiveX; 
      double nextB = MotionControl.LiveB + AngleIncr; 
      nextB = nextB >= 45 ? 45 : nextB;  
       Task.Run(() => 
       { 
        SystemCommands.ExecuteCommand(CommandNames.GotoPosition, new Tuple<double,double>(nextX, nextB)); 
       }); 
     },  
     _ => 
     { 
      if (MotionControl == null) 
       return false; 
      return !MotionControl.InMotionCheckStatus; 
     })); 
if (MotionControl != null) 
{ 
    MotionControl.MotionChanged += SystemCommands.GetRelayCommand(CommandNames.IncrAngle).CanExecutePropertyChangedNotification; 
} 

Update: ich ein paar Leute ihre Köpfe in eine haben stocherte einen Blick genommen zu sehen. Wenn jemand einen Vorschlag hat, wie ich die Frage selbst verbessern könnte, würde ich das Feedback begrüßen. Aus meiner mangelnden Reputation kann man wahrscheinlich erahnen, dass ich neu bin.

+0

btw zweites Lambda vereinfacht werden:! '_ => Motion = null && MotionControl.InMotionCheckStatus' – abatishchev

+0

Excellent Vorschlag. Danke abatischtschew. Es ist im Moment sehr ausführlich und komisch, während ich versuche, alle Komponenten richtig zusammen zu arbeiten. Ich werde vor dem Versand umgestalten. – AClark

Antwort

1

Die Repeat Button sollte das tun, was Sie suchen

Interval -> die Zeit in Millisekunden zwischen den Wiederholungen einmal beginnt zu wiederholen. Der Wert muss nicht negativ sein.

Delay -> die Zeit in Millisekunden, die der RepeatButton wartet, während er gedrückt wird, bevor er sich zu wiederholen beginnt.

<RepeatButton FontFamily="Marlett" 
     Delay="500" 
     Interval="100" 
     FontSize="40" 
     Content="5" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Top" 
     Margin="100" 
     Width="100" 
     Height="50"   
     Command="{Binding IncrBAnglePos}" 
     CommandParameter="{Binding ElementName=slider, Path=Value}"> 
</RepeatButton> 
+0

Terrance, ich bin froh, dass ich falsch liege und lerne, dass das RepeatButton-Steuerelement genauso gut auf Befehlsbindungen funktioniert wie auf Knopfdruck. Danke an alle, die das für mich angeschaut haben. – AClark

Verwandte Themen