AvalonEdit 作为文本查看器 - 无插入符号

AvalonEdit as a text viewer - no caret

我希望 AvalonEdit 成为文本查看器。

我可以做:

textEditor.IsReadOnly = true;

并且该控件不允许进行任何更改,但它仍然像编辑器一样运行 - 显示插入符号,并使用导航键(箭头,页面 up/down)移动插入符号而不是滚动视图.

有什么办法让它成为查看器吗?或者至少,隐藏插入符号?

尝试将 IsHitTestVisible 属性 设置为 false:

textEditor.IsHitTestVisible = false;

It does hide the caret, but a lot of thing do not work anymore, ie. scrolling with mouse wheel

如果您只想隐藏插入符号,您可以将其 CaretBrush 属性 设置为 Transparent:

textEditor.TextArea.Caret.CaretBrush = Brushes.Transparent;

AvalonEdit 由三个部分组成:

  • TextEditor,将 TextArea 包装在 ScrollViewer 中,并添加一个高级 TextBox-like API
  • TextArea,采用 TextView 并添加插入符号、选择和输入处理
  • TextView,也就是实际代码显示

所以要禁用所有编辑功能,您可以直接使用TextView class。要启用滚动,您需要自己将其包装在 ScrollViewer 中(重要:启用 CanContentScroll 以避免呈现文档的不可见部分)

<ScrollViewer
       Focusable="False"
       CanContentScroll="True"
       VerticalContentAlignment="Top"
       HorizontalContentAlignment="Left">
    <avalonedit:TextView Name="textView" />
</ScrollViewer>

通过直接使用 TextView 组件,您需要完成一些通常由 TextEditor 自己完成的工作:

textView.Document = new TextDocument(); // create document instance
textView.LineTransformers.Insert(0,
    new HighlightingColorizer(HighlightingManager.Instance.GetDefinition("C#")));

如果您想保留一些编辑功能(例如选择文本并将其复制到剪贴板),

TextView 是不够的。 在这种情况下,您需要继续使用 TextEditorTextArea,并禁用不需要的功能。

您不能真正禁用插入符号,因为选择逻辑取决于插入符号,但您可以隐藏它:

textEditor.TextArea.Caret.CaretBrush = Brushes.Transparent;

将文档设为只读将禁用文本输入和各种编辑命令:

textEditor.IsReadOnly = true;

您可能还想从文本区域的输入处理程序中删除命令:

// remove the keyboard caret navigation and selection logic,
// but keep the mouse selection logic and editing commands
textEditor.TextArea.DefaultInputHandler.NestedInputHandlers.Remove(
    textEditor.TextArea.DefaultInputHandler.CaretNavigation);