2012-04-17 10 views
0

ユーザーが押したキーストロークをキャプチャし、それを入力として扱うコントロールを設計する必要があります。キー押されたコントロールを設計する最良の方法は何ですか?

私は、彼らが押された1知っているので、それをユーザーに表示する必要があります。

私はテキストボックスを使用して、ValueChangedイベントにアップ配線しようとしたが、それは何らかの理由でキーを2回表示されます。

誰もがこの機能を扱う可能性がすでに構築されているコントロールを知っていますか?

追記:私はそのような修飾キーか何かで実装する必要はありませんが、私は時間があるために、単一のキーストロークを追跡しようとしています。

それを見てのもう一つの方法は次のとおりです。ほとんどすべてのPCのビデオゲームでは、ゲームの設定でキーバインドを変更することができます。設定に行き、探しているキーバインドを見つけて選択し、キーストロークを押すと、そのキーストロークをキャプチャし、ユーザーが入力したキーストロークへのキーバインドを変更します。それ

はまさに私が探している機能です。

答えて

0

私は何を持ってしまったことは、このでした:これは基本的に設定することで、テキストボックスのデフォルトのキーの機能を無効に

private void previewKeyDown(object sender, KeyEventArgs e) 
{ 
    e.Handled = true; 
    textBox1.Text = e.Key.ToString(); 
} 

<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 

次に、テキストボックスのテキストを必要なものに変更しました。これは、キーが押された。

0

は、あなたは、このスタックオーバーフローが質問を繰り返し参照してください 、この場合のフォームイベントをキャッチする必要があり、それはあなたに答え

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> 

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

2番目のオプションで行くなら、私は本当にあなたがジョシュ・スミスMSDNの記事を見てみましょうお勧めします。

関連する問題