WPF中带文本框的TreeViewItem:输入特殊字符

本文关键字:TreeViewItem 输入 特殊字符 文本 WPF | 更新日期: 2023-09-27 18:10:07

我需要编辑一些层次结构,我使用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

WPF中带文本框的TreeViewItem:输入特殊字符

最终用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
                });
    }
}

我可以为你的文本框建议一个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;可以防止默认行为