如何使键盘可滚动只读WPF TextBox?

dav*_*pfx 3 c# wpf

这似乎是一件简单的事情:使用TextBox显示一些输出并允许用户从中剪切和粘贴,滚动但不编辑它.

但是:如果TextBox是只读的,那么它会失去大部分键盘行为.您可以单击它并使用不可见光标选择文本,但不会滚动或导航.

我有这个(可怕的)解决方案.

<TextBox Focusable="True"
     VerticalScrollBarVisibility="Auto"
     HorizontalScrollBarVisibility="Auto"
     FontFamily="Consolas" FontSize="10pt"
     Foreground="{Binding Path=OutputTextColour}" 
     Text="{Binding Path=OutputText}"
     Background="White" PreviewKeyDown="TextBox_PreviewKeyDown" />
Run Code Online (Sandbox Code Playgroud)

以及丢弃任何编辑尝试的处理程序:

   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;
}
Run Code Online (Sandbox Code Playgroud)

我还在ScrollViewer中尝试了一个只读的TextBox,但是看起来TextBox,即使只是readonly,仍然吞下导航按键,ScrollView永远不会看到它们.如果ScrollViewer获得焦点,那么滚动工作并且剪切/复制/粘贴不会!

是的,我可能通过使用PreviewKeyDown的一些花哨的步法来完成所有工作,但实际上我只是想要一个非常好的TextBox!

Jim*_*oye 8

答案是设定

IsReadOnlyCaretVisible="True"
Run Code Online (Sandbox Code Playgroud)

如下所述:

具有可见光标的WPF的只读文本框(.NET 3.5)

工作得很漂亮!