如何在也用作 KeyBinding 的 TextBox 中写入内容?

How can I write something in a TextBox that's also used as a KeyBinding?

我有一个针对关键时期 (.) 的全局输入绑定。我仍然希望能够在 TextBox 中输入它?有办法实现吗?

这是一个简单的示例案例。当我在 TextBox.

中键入句点时执行该命令

XAML:

<Window x:Class="UnrelatedTests.Case6.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Window.InputBindings>
        <KeyBinding Key="OemPeriod" Command="{Binding Command}" />
    </Window.InputBindings>
    <Grid>
        <TextBox >Unable to type "." here!</TextBox>
    </Grid>
</Window>

C#:

using System;
using System.Windows;
using System.Windows.Input;

namespace UnrelatedTests.Case6
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            DataContext = this;
        }

        public ICommand Command
        {
            get { return new CommandImpl(); }
        }


        private class CommandImpl : ICommand
        {
            public bool CanExecute(object parameter)
            {
                return true;
            }

            public void Execute(object parameter)
            {
                MessageBox.Show("executed!");
            }

            public event EventHandler CanExecuteChanged;
        }
    }
}

您可以 绑定 KeyBinding 中的 Key 并在 TextBox 获得焦点时将其值更改为 Key.None :

Xaml:

<Window x:Class="UnrelatedTests.Case6.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300"
        GotFocus="Window_GotFocus">
    <Window.InputBindings>
        <KeyBinding Key="{Binding MyKey}" Command="{Binding Command}" />
    </Window.InputBindings>
    <Grid>
        <TextBox/>
    </Grid>
</Window>

MainWindow.cs:实施了 INotifyPropertyChanged

    Key _myKey;
    public Key MyKey
    {
        get
        {
            return _myKey;
        }
        set
        {
            _myKey = value;
            OnPropertyChanged("MyKey");
        }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        MyKey = Key.OemPeriod;
    }

    private void Window_GotFocus(object sender, RoutedEventArgs e)
    {
        if (e.OriginalSource is TextBox)
            MyKey = Key.None;
        else
            MyKey = Key.OemPeriod;
    }