C# Tablet PC输入面板不会导致TextInput事件?

C# Tablet PC输入面板不会导致TextInput事件?,c#,wpf,textinput,C#,Wpf,Textinput,我有一个自定义控件,它使用WPF TextInput事件。这在使用键盘时效果很好;但是,如果使用“Tablet PC输入面板”(随Windows 7提供)的手写识别,则单击“插入”按钮时不会发生TextInput事件 public partial class Window1 : Window { public Window1() { } protected override void OnTextInput(TextCompositionEventArgs e)

我有一个自定义控件,它使用WPF TextInput事件。这在使用键盘时效果很好;但是,如果使用“Tablet PC输入面板”(随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();
    }
}
公共部分类窗口1:窗口
{
公共窗口1()
{
}
受保护的覆盖无效输出(TextCompositionEventArgs e)
{
基本输出(e);
此.Title=e.文本;
}
}
类文本:控件
{
静态文本()
{
Keyboard Navigation.IsTabStopProperty.OverrideMetata(
typeof(文本),新的框架属性ymetadata(true));
KeyboardNavigation.TabNavigationProperty.OverrideMetata(
typeof(文本),新的FrameworkPropertyMetadata(KeyboardNavigationMode.None));
FocusableProperty.OverrideMetadata(
typeof(文本),新的框架属性ymetadata(true));
}
public static readonly dependencProperty EnteredTextProperty=
DependencyProperty.Register(“EnteredText”、typeof(字符串)、typeof(文本),
新的FrameworkPropertyMetadata());
公共字符串输入文本{
获取{return(string)GetValue(EnteredTextProperty);}
set{SetValue(EnteredTextProperty,value);}
}
受保护的覆盖无效输出(TextCompositionEventArgs e)
{
this.EnteredText=e.Text;
e、 已处理=正确;
}
/// 
MouseDown上的受保护覆盖无效(MouseButtonEventArgs e)
{
base.OnMouseDown(e);
焦点();
}
}
以下是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中的错误吗?是否有解决方法?

控件在插入后会丢失其焦点的属性,如果在MouseDown事件上调用focus(),则无法恢复这些属性(因为实际上它已聚焦,并且OnFocus事件不会再次释放)

如果将其他控件对焦,并将自定义控件再次对焦,则会发生TextInput事件(直到再次插入tablet pc输入的文本)


我无法解释发生了什么,我认为这可能是WPF的一个缺陷,但可能这些信息有助于解决……据我所知,当您单击窗口时,文本对象失去焦点,因此无法捕获事件

protected override void OnMouseDown(MouseButtonEventArgs e)
{
    base.OnMouseDown(e);
    Focus();
}
这似乎不起作用的原因是因为它需要单击文本对象来聚焦文本类

我的建议是:

  • 为窗口的mousedown添加事件处理程序以聚焦文本项
  • 在窗口中键入时聚焦文本对象
  • 在窗口中捕获关键点时写入文本对象和窗口标题

  • 您使用的是哪个版本的.NET?我知道他们在.NET4中修复了一些与WPF文本输入有关的错误,但我不知道这是否是其中之一。使用键盘时,TextInput工作正常,因此键盘的焦点是文本对象。只有手写识别失败。看起来手写识别可能有一个单独的焦点??