什么是设计按键控制的最佳方式?
我需要设计一个控件,捕捉用户按下的关键笔划并将其作为输入。什么是设计按键控制的最佳方式?
然后我需要显示给用户,让他们知道他们按下了哪一个。
我试过使用一个文本框,并连线到ValueChanged事件,但它出于某种原因两次显示该键。
有谁知道已经构建的可能处理此功能的控件?
旁注:我不需要使用修饰键或类似的东西来实现,我只是想暂时跟踪一个关键笔划。
查看它的另一种方法是:在几乎每个PC视频游戏中,都可以更改游戏设置中的键绑定。您可以进入设置,找到要查找的键绑定,选择它,然后点击按键,然后捕获该按键并将键绑定更改为用户输入的按键。
那正是我正在寻找的功能。
我最终什么事不得不做的是:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Name="textBox1" PreviewKeyDown="previewKeyDown" />
</Grid>
,然后在我,甚至处理做到这一点:
private void previewKeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
textBox1.Text = e.Key.ToString();
}
这基本上通过设置禁用文本框的默认密钥功能
e.Handled = true
然后我改变了文本框的文本是我所需要的,这是第th被按下的e键。
简单的方式做,这将是数据绑定。在WPF中这很容易。您可以将数据从一个控件绑定到另一个控件。下面我已经绑定了一个TextBox,它已经接受了用户的输入,并将其显示给一个Label。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Height="23" HorizontalAlignment="Left" Margin="45,55,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
<Label Content="{Binding ElementName=textBox1, Path=Text}" Height="28" HorizontalAlignment="Left" Margin="45,135,0,0" Name="label1" VerticalAlignment="Top" Width="142" />
</Grid>
更复杂的答案是做命令绑定。它所做的是捕获UserControl或Window上的特定键绑定,并执行给定的命令。这有点复杂,因为它需要你创建一个实现ICommand的类。
此处了解详情: http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx
我个人的约什 - 史密斯的RelayCommand实施的大风扇。有一篇很棒的文章here。
总之,尽管你可以做到这一点。
XAML:
<Window.InputBindings>
<KeyBinding Key="Escape" Command="{Binding KeyPressCommand}"/>
</Window.InputBindings>
CODE: 您将需要创建一个RelayCommand类。
public class RelayCommand : ICommand
{
private readonly Action<object> _execute;
private readonly Predicate<object> _canExecute;
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
_execute(parameter);
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute(parameter);
}
然后要在您的主窗口中实现此操作,您需要执行此操作。
private RelayCommand _keyPressCommand;
public RelayCommand KeyPressCommand
{
get
{
if (_keyPressCommand== null)
{
_keyPressCommand = new RelayCommand(
KeyPressExecute,
CanKeyPress);
}
return _keyPressCommand;
}
}
private void KeyPressExecute(object p)
{
// HANDLE YOUR KEYPRESS HERE
}
private bool CanSaveZone(object parameter)
{
return true;
}
如果你选择第二个选项,我真的建议你看一下Josh Smith的MSDN文章。
我知道如何捕捉关键事件,那不是我的问题。我的问题是控制工作,它只会响应一个关键事件(不是多个)并显示那个关键事件是什么。 – Joseph 2012-04-17 02:31:18
你想要控制什么样的控制以及你想跟踪的事件是什么? – las 2012-04-17 06:21:28
我认为KeyDown是解决您的问题的最佳方法,请参阅此MSDN链接http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.keydown.aspx – las 2012-04-17 06:43:03