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

时间:2010-11-18 21:30:57

标签: c# wpf textinput

我有一个使用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();
    }
}

这是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中的错误吗?有工作吗?

2 个答案:

答案 0 :(得分:1)

如果在MouseDown事件上调用Focus(),控件在插入后会丢失其焦点的属性,并且不会将其返回(因为实际上它是聚焦的并且OnFocus事件不会再次释放)。

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

我无法解释什么是happing,我认为这可能是WPF的一个错误,但也许这些信息可以帮助解决...

答案 1 :(得分:1)

据我所知,当您点击窗口时,文本对象失去焦点,因此无法捕获事件。

protected override void OnMouseDown(MouseButtonEventArgs e)
{
    base.OnMouseDown(e);
    Focus();
}

这似乎不起作用的原因是因为它需要单击文本对象来聚焦文本类

我建议的是:

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