WPF中带有TextBox的TreeViewItem:输入特殊字符

22

我需要编辑一些分层结构并使用TreeViewTextBoxes

简短的示例

<TreeView>
    <TreeView.Items>
        <TreeViewItem Header="Level 0">
            <!-- Level 1-->
            <TextBox Margin="5"
                     BorderThickness="1" BorderBrush="Black" />
        </TreeViewItem>
    </TreeView.Items>
</TreeView>
当我在TextBox中输入加减号、字母和数字时都能正常工作,箭头键也可以使用,但是当我按-时,Level 0的项目会折叠,并且当我输入*时,什么也不会发生。
我该如何处理-*才能在TextBox中正确显示它们?
编辑:
如果将-键输入为Key.OemMinus则可以正常工作,但是从数字键盘输入Key.Subtract则无效。
如果将*键输入为Shift+Key.D8则可以正常工作,但是从数字键盘输入Key.Multiply则无效。

Key.Multiply 应该可以正常工作。在我的解决方案中是这样的。 - Kcvin
@NETscape,如果我在选择Level 0项目时尝试在文本框中输入Key.Multiply,它对我不起作用。 - ASh
啊,现在我让这个项目可选了,先选中它,结果它没起作用。有趣! - Kcvin
2个回答

16

最终通过Key.Subtract解决了这个问题。

我在TextBox上添加了PreviewKeyDown处理程序。

<TextBox Margin="5" BorderThickness="1" BorderBrush="Black" 
         PreviewKeyDown="TextBoxPreviewKeyDown"
/>

在收到 Key.Subtract 后,KeyDown 被标记为已处理,然后我手动触发 TextInput 事件,就像这个回答中所解释的一样 (如何在C#中以编程方式生成按键事件?)。

private void TextBoxPreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Subtract)
    {
        e.Handled = true;

        var text = "-";
        var target = Keyboard.FocusedElement;
        var routedEvent = TextCompositionManager.TextInputEvent;

        target.RaiseEvent(
            new TextCompositionEventArgs
                (
                     InputManager.Current.PrimaryKeyboardDevice,
                    new TextComposition(InputManager.Current, target, text)
                )
                {
                    RoutedEvent = routedEvent
                });
    }
}

5
我可以为您提供一个建议,对于您所拥有的文本框,可以使用“keydown”事件。
<TextBox Margin="5" KeyDown="TextBox_KeyDown"
                     BorderThickness="1" BorderBrush="Black" />


 private void TextBox_KeyDown(object sender, KeyEventArgs e)
 {
    TextBox txt = sender as TextBox;
    if(e.Key == Key.Subtract)
    {
        txt.Text += "-";
        txt.SelectionStart = txt.Text.Length;
        txt.SelectionLength = 0;
        e.Handled = true;
    }
    else if (e.Key == Key.Multiply)
    {
        txt.Text += "*";
        txt.SelectionStart = txt.Text.Length;
        txt.SelectionLength = 0;
        e.Handled = true;
    }
}

这不是一个很好的解决方案,但它可以工作。如果你有任何其他“问题”键,你可以在事件中添加一个 if 语句。

SelectionStartSelectionLength 是用于将光标定位于文本框末尾的。而 e.Handled = true; 可以防止默认行为。


谢谢您的建议,txt.Text +=“-”并不完全符合我的需求(可能会有选定的文本需要替换)。我必须找到另一种解决方法。 - ASh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接