如何使WPF文本框中的键盘滚动只读?

4
似乎这是一个很简单的事情:使用文本框显示一些输出,并允许用户从中剪切和粘贴,滚动但不编辑它。
但是:如果文本框是只读的,那么它就会失去大部分键盘行为。您可以单击它并使用不可见的光标选择文本,但它将无法滚动或导航。
我有一个(可怕的)解决方案。
<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 的一些花式操作来实现所有这些功能,但实际上我只想要一个表现良好的文本框!

对于您当前的解决方案,如果我想按住Shift键并使用箭头键进行选择,或者按Ctrl键选择整个单词,该怎么办? - Mathemats
有哪些键盘操作有所缺失?我可以通过 Shift 和 Ctrl 键选择文本……我可以使用箭头键,并用鼠标选择进行滚动。 - Bubba
@Bubba:PgUp,PgDn,Home,End,Ctrl+Home,Ctrl+End失去了它们的滚动行为。 - david.pfx
@Mathemats:它们运行良好。箭头键未标记为已处理,因此会被传递。 - david.pfx
我可能漏掉了什么,但是你的if语句读作:如果按键不是(左,上等),则处理它。难道你不想处理这些按键吗?另外,在if的主体周围加上一些花括号。 - Mathemats
@Mathemats:如果键不是左、上等,则标记为已处理,以便它不会被传递。只允许TextBox看到这些字符。【我从不写不必要的大括号——你也不应该这样做。】 - david.pfx
1个回答

11

谢谢!那听起来像是答案。我现在无法检查它,但希望很快就能检查到... - david.pfx
这对我很有用 - 看起来是正确答案 @david.pfx - GilesDMiddleton
这使得“Page Up”和“Page Down”按钮翻页,但不是光标键。相比之前,仍然是一个简单的改进。 - Christopher Painter

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