0

ユーザーが押したキー ストロークをキャプチャし、それを入力として扱うコントロールを設計する必要があります。

次に、それをユーザーに表示して、どちらを押したかがわかるようにする必要があります。

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

この機能を処理する可能性のある既に構築されているコントロールを知っている人はいますか?

補足: 修飾キーなどを使用した実装は必要ありません。当面は 1 つのキー ストロークを追跡しようとしています。

別の見方をすると、ほぼすべての PC ビデオ ゲームで、ゲームの設定でキー バインドを変更できます。設定に移動し、探しているキー バインディングを見つけて選択し、キーストロークを押すと、そのキーストロークがキャプチャされ、キー バインディングがユーザーが入力したキーストロークに変更されます。

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

4

3 に答える 3

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

個人的には、Josh Smith による RelayCommand 実装の大ファンです。ここに素晴らしい記事があります。

要するに、あなたはこれを行うことができます。

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

2 番目のオプションを選択する場合は、Josh Smith による MSDN の記事を参照することを強くお勧めします。

于 2012-04-17T02:35:49.097 に答える
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

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

于 2012-04-17T15:46:20.820 に答える
0

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

Fire Form KeyPress イベント

于 2012-04-17T02:28:40.940 に答える