#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