如何使键盘可滚动只读 WPF 文本框

本文关键字:WPF 文本 只读 滚动 何使 键盘 | 更新日期: 2023-09-27 18:31:38

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

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

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

<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中尝试过只读文本框,但似乎TextBox,即使是只读的,仍然会吞噬导航击键,而ScrollView永远不会看到它们。如果滚动查看器获得焦点,则滚动有效,剪切/复制/粘贴不起作用!

是的,我可以通过一些花哨的步法来使用PreviewKeyDown来使所有这些工作,但实际上我只想要一个玩得很好的文本框!

如何使键盘可滚动只读 WPF 文本框

答案是设置

IsReadOnlyCaretVisible="True"

如下所述:

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

效果很好!