У меня есть настраиваемый элемент управления, который использует события WPF TextInput. Это отлично работает при использовании клавиатуры; однако, если используется распознавание рукописного ввода «Панели ввода планшетного ПК» (поставляется с Windows 7), событие TextInput не возникает при нажатии кнопки «Вставить».
public partial class Window1 : Window
{
public Window1()
{
}
protected override void OnTextInput(TextCompositionEventArgs e)
{
base.OnTextInput(e);
this.Title = e.Text;
}
}
class Text : Control
{
static Text()
{
KeyboardNavigation.IsTabStopProperty.OverrideMetadata(
typeof(Text), new FrameworkPropertyMetadata(true));
KeyboardNavigation.TabNavigationProperty.OverrideMetadata(
typeof(Text), new FrameworkPropertyMetadata(KeyboardNavigationMode.None));
FocusableProperty.OverrideMetadata(
typeof(Text), new FrameworkPropertyMetadata(true));
}
public static readonly DependencyProperty EnteredTextProperty =
DependencyProperty.Register("EnteredText", typeof(string), typeof(Text),
new FrameworkPropertyMetadata());
public string EnteredText {
get { return (string)GetValue(EnteredTextProperty); }
set { SetValue(EnteredTextProperty, value); }
}
protected override void OnTextInput(TextCompositionEventArgs e)
{
this.EnteredText = e.Text;
e.Handled = true;
}
/// <inheritdoc/>
protected override void OnMouseDown(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
Focus();
}
}
Вот XAML:
<Window x:Class="TestProject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300"
>
<local:Text xmlns:local="clr-namespace:TestProject">
<Control.Template>
<ControlTemplate TargetType="local:Text">
<Border Background="Beige">
<Viewbox>
<TextBlock Text="{TemplateBinding EnteredText}"/>
</Viewbox>
</Border>
</ControlTemplate>
</Control.Template>
</local:Text>
</Window>
Когда приложение запускается, ввод текста отображается в строке заголовка. После того, как вы щелкнете в окне, чтобы переключить фокус на элемент управления, для ввода будет работать только клавиатура; распознавание рукописного ввода игнорируется.
Кто-нибудь знает, что происходит не так? Почему в одном случае я получаю событие TextInput, а в другом - нет? Это ошибка в WPF? Есть ли обходной путь?