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