Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计按键控件的最佳方法是什么?_C#_Wpf - Fatal编程技术网

C# 设计按键控件的最佳方法是什么?

C# 设计按键控件的最佳方法是什么?,c#,wpf,C#,Wpf,我需要设计一个控件来捕获用户按下的按键,并将其作为输入 然后我需要将它显示给用户,以便他们知道他们按下了哪一个 我尝试过使用文本框,并连接到ValueChanged事件,但出于某种原因,它显示了两次键 有人知道已经构建的控件可能处理此功能吗 旁注:我不需要一个带有修改键或类似的东西的实现,我只是暂时尝试跟踪单个键的笔划 另一种看待它的方式是:在几乎所有的电脑视频游戏中,你都可以在游戏的设置中更改键绑定。转到“设置”,找到要查找的键绑定,选择它,然后点击一个击键,然后它捕获该击键并将键绑定更改为用

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

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

我尝试过使用文本框,并连接到ValueChanged事件,但出于某种原因,它显示了两次键

有人知道已经构建的控件可能处理此功能吗

旁注:我不需要一个带有修改键或类似的东西的实现,我只是暂时尝试跟踪单个键的笔划

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


这正是我想要的功能。

您必须捕获本案例的表单事件, 参考这个问题,它将为您提供答案


实现这一点的简单方法是数据绑定。在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>

如果你选择第二个选项,我真的建议你看看Josh Smith的MSDN文章。

我最后不得不做的是:

<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>
这基本上通过设置禁用了文本框的默认键功能

e.Handled =  true

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

我知道如何捕获键事件,这不是我的问题。我的问题是使一个控件只对单个关键事件(而不是多个)做出响应,并显示该关键事件是什么。您希望使用的控件是什么,您希望跟踪的事件是什么?我认为向下键是解决问题的最佳方法,请参阅此MSDN链接。我要问的是,对于此类功能,应使用何种控件。我的第一个想法是使用textinput并覆盖KeyDown事件,但它没有按照我需要的方式工作。我需要一个控件,它可以捕获单个按键事件并显示用户按下的按钮。为什么不使用form control?form events是事件首先触发的控件,而不是表单中的其他控件,因此最好使用form control及其事件
 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;
}
<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