【发布时间】:2018-11-23 20:16:53
【问题描述】:
是否有一些优雅的方法可以允许粘贴到已将 AcceptsTab 设置为 false 的 WPF 文本框,同时保留粘贴文本中的选项卡?
当 AcceptsTab 为真时,用户不能使用选项卡移动到下一个控件,这是我的用户不希望的。但他们想要粘贴标签,目前已被空格替换。
谢谢
【问题讨论】:
是否有一些优雅的方法可以允许粘贴到已将 AcceptsTab 设置为 false 的 WPF 文本框,同时保留粘贴文本中的选项卡?
当 AcceptsTab 为真时,用户不能使用选项卡移动到下一个控件,这是我的用户不希望的。但他们想要粘贴标签,目前已被空格替换。
谢谢
【问题讨论】:
我不确定这是否称得上优雅,但它可以工作,但可能不像你想要的那样完整(例如,在文本框中右键单击并从上下文菜单中选择粘贴时)。
在处理 Ctrl-V 之前将 AcceptsTab 设置为 true 并在之后恢复它:
XAML:
<TextBox AcceptsTab="False"
Height="200"
PreviewKeyDown="TextBox_PreviewKeyDown"
KeyUp="TextBox_KeyUp"/>
C#:
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (!(sender is TextBox textbox))
{
return;
}
if (e.Key == Key.V && (e.KeyboardDevice.IsKeyDown(Key.LeftCtrl) || e.KeyboardDevice.IsKeyDown(Key.RightCtrl)))
{
textbox.AcceptsTab = true;
}
}
private void TextBox_KeyUp(object sender, KeyEventArgs e)
{
if (!(sender is TextBox textbox))
{
return;
}
textbox.AcceptsTab = false;
}
这可以变成一种行为,这样可以更容易地将其应用于更多的文本框,而无需在后面编写代码。
【讨论】:
另一种方法是将 AcceptsTab 设置为 true 并在按下 (Shift) Tab 时移动焦点。
很好的副作用是所有复制/粘贴场景仍然可以使用,但用户将无法键入选项卡。
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Tab)
{
var textBox = sender as TextBox;
if (textBox != null)
{
var direction =
e.KeyboardDevice.IsKeyDown(Key.LeftShift) || e.KeyboardDevice.IsKeyDown(Key.RightShift)
? FocusNavigationDirection.Previous
: FocusNavigationDirection.Next;
textBox.MoveFocus(new TraversalRequest(direction));
}
}
}
【讨论】: