似乎这是一个很简单的事情:使用文本框显示一些输出,并允许用户从中剪切和粘贴,滚动但不编辑它。
但是:如果文本框是只读的,那么它就会失去大部分键盘行为。您可以单击它并使用不可见的光标选择文本,但它将无法滚动或导航。
我有一个(可怕的)解决方案。
我也尝试过将只读的文本框放在滚动视图(ScrollViewer)中,但似乎即使是只读的文本框仍然会吞噬导航按键,而滚动视图则无法感知到。如果滚动视图获得了焦点,则可以进行滚动操作,但剪切/复制/粘贴则不行!
可能我可以通过 PreviewKeyDown 的一些花式操作来实现所有这些功能,但实际上我只想要一个表现良好的文本框!
但是:如果文本框是只读的,那么它就会失去大部分键盘行为。您可以单击它并使用不可见的光标选择文本,但它将无法滚动或导航。
我有一个(可怕的)解决方案。
<TextBox Focusable="True"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
FontFamily="Consolas" FontSize="10pt"
Foreground="{Binding Path=OutputTextColour}"
Text="{Binding Path=OutputText}"
Background="White" PreviewKeyDown="TextBox_PreviewKeyDown" />
还需要一个处理程序来丢弃任何编辑尝试:
private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) {
// the IsReadOnly flag on the control doesn't let the navigation keys work! WPF BUG?
if (!(e.Key == Key.Down || e.Key == Key.Up || e.Key == Key.Left || e.Key == Key.Right
|| e.Key == Key.Home || e.Key == Key.End || e.Key == Key.PageDown || e.Key == Key.PageUp
|| e.Key == Key.Tab || e.Key == Key.Escape))
e.Handled = true;
}
我也尝试过将只读的文本框放在滚动视图(ScrollViewer)中,但似乎即使是只读的文本框仍然会吞噬导航按键,而滚动视图则无法感知到。如果滚动视图获得了焦点,则可以进行滚动操作,但剪切/复制/粘贴则不行!
可能我可以通过 PreviewKeyDown 的一些花式操作来实现所有这些功能,但实际上我只想要一个表现良好的文本框!