2012-04-17 3 views
0

Мне нужно создать элемент управления, который будет захватывать нажатие клавиши, которую пользователь нажал, и рассматривать это как вход.Каков наилучший способ создания клавишного управления?

Затем я должен показать его пользователю, чтобы он знал, какой из них он нажал.

Я попытался использовать текстовое поле и подключиться к событию ValueChanged, но по какой-либо причине он показывает ключ дважды.

Кто-нибудь знает, какой элемент управления уже построен, который может обрабатывать эту функциональность?

Sidenote: Мне не нужна реализация с помощью клавиш-модификаторов или что-то в этом роде, я просто пытаюсь отслеживать один ключевой штрих на данный момент.

Еще один способ взглянуть на это: в почти каждой видеоигре ПК вы можете изменить привязки клавиш в настройках игры. Вы переходите к настройкам, находите ключевое связывание, которое ищете, выбираете его, а затем нажимаете на нажатие клавиши, затем оно фиксирует это нажатие клавиши и меняет привязку клавиш к нажатию клавиши, введенной пользователем.

То, что - это именно то, что я ищу.

ответ

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 

, а затем я изменил текст текстового поля на то, что мне было нужно, что было e, который был нажат.

0

Вы должны поймать вид события для этого случая, См этот Stack Overflow повторил вопрос, он даст вам ответ

Fire Form KeyPress event

+0

Я знаю, как захватить ключевое событие, это не моя проблема. Моя проблема заключается в создании контрольной работы, где она будет реагировать только на одно ключевое событие (не многократно) и отображать, что это за ключевое событие. – Joseph

+0

Какой элемент управления вы хотите работать и какое событие вы хотите отслеживать? – las

+0

Я думаю, что KeyDown - лучший способ вашей проблемы, см. Эту ссылку MSDN http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown.aspx – las

2

Простой способ сделать это будет привязка данных. В WPF это довольно просто. Вы можете привязать данные от одного элемента управления к другому. Ниже я привязал TextBox, который взял пользовательский ввод, к ярлыку, который отображает его.

<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> 

КОД: Вам нужно будет создать 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; 
} 

Если вы идете со вторым вариантом, я действительно предлагаю вам взглянуть на статью MSDN Джоша Смита.

Смежные вопросы