2012-04-17 103 views
0

我需要设计一个控件,捕捉用户按下的关键笔划并将其作为输入。什么是设计按键控制的最佳方式?

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

我试过使用一个文本框,并连线到ValueChanged事件,但它出于某种原因两次显示该键。

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

旁注:我不需要使用修饰键或类似的东西来实现,我只是想暂时跟踪一个关键笔划。

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

正是我正在寻找的功能。

回答

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 

然后我改变了文本框的文本是我所需要的,这是第th被按下的e键。

0

你必须抓住这种情况下,窗体事件, 请参阅此堆栈溢出重复的问题,它会为你提供答案

Fire Form KeyPress event

+0

我知道如何捕捉关键事件,那不是我的问题。我的问题是控制工作,它只会响应一个关键事件(不是多个)并显示那个关键事件是什么。 – Joseph 2012-04-17 02:31:18

+0

你想要控制什么样的控制以及你想跟踪的事件是什么? – las 2012-04-17 06:21:28

+0

我认为KeyDown是解决您的问题的最佳方法,请参阅此MSDN链接http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.keydown.aspx – las 2012-04-17 06:43:03

2

简单的方式做,这将是数据绑定。在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文章。

相关问题