如何使键盘可滚动只读 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来使所有这些工作,但实际上我只想要一个玩得很好的文本框!
答案是设置
IsReadOnlyCaretVisible="True"
如下所述:
具有可见光标的 WPF 的只读文本框 (.NET 3.5)
效果很好!