WPF中带文本框的TreeViewItem:输入特殊字符
本文关键字:TreeViewItem 输入 特殊字符 文本 WPF | 更新日期: 2023-09-27 18:10:07
我需要编辑一些层次结构,我使用TreeView
与TextBoxes
简短示例
<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.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。
SelectionStart
和SelectionLength
用于将光标定位到文本框末尾。并且e.Handled = true;
可以防止默认行为