0

我需要设计一个控件来捕获用户按下的击键并将其视为输入。

然后我需要将它显示给用户,以便他们知道他们按下了哪一个。

我尝试使用文本框,并连接到 ValueChanged 事件,但由于某种原因它两次显示密钥。

有谁知道已经构建的可以处理此功能的控件?

旁注:我不需要使用修饰键或类似功能的实现,我只是暂时尝试跟踪单个击键。

另一种看待它的方式是:在几乎所有 PC 视频游戏中,您都可以更改游戏设置中的键绑定。您转到设置,找到您要查找的键绑定,选择它,然后点击一个键,然后它会捕获该键并将键绑定更改为用户输入的键。

正是我正在寻找的功能。

4

3 回答 3

2

执行此操作的简单方法是数据绑定。在 WPF 中,这很容易。您可以将数据从一个控件绑定到另一个控件。下面我将一个接受用户输入的文本框绑定到一个显示它的标签上。

<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

我个人是 Josh Smith 实现的 RelayCommand 的忠实粉丝。这里有一篇很棒的文章。

总之,虽然你可以做到这一点。

XAML:

<Window.InputBindings>
        <KeyBinding Key="Escape" Command="{Binding KeyPressCommand}"/>
</Window.InputBindings>

代码: 您需要创建一个 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 文章。

于 2012-04-17T02:35:49.097 回答
0

对于这种情况,您必须捕获表单事件,请参阅此 Stack Overflow 重复问题,它将为您提供答案

Fire Form KeyPress 事件

于 2012-04-17T02:28:40.940 回答
0

我最终不得不做的是:

<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

然后我将文本框的文本更改为我需要的,这是按下的键。

于 2012-04-17T15:46:20.820 回答