如何在AvalonEdit中监听折叠事件

问题描述 投票:0回答:3

我已成功将折叠添加到我的

AvalonEdit
文档中,但是,为了获得真正有用的体验,我需要存储折叠状态,以便下次用户打开文档时,折叠状态会恢复。

我的问题是如何知道

FoldSection
何时被用户折叠,例如单击时? 此类不通知属性更改。我找不到任何事件来改变折叠状态。

c# wpf folding avalonedit
3个回答
2
投票

我知道这已经很旧了,这并不完全是您正在寻找的,但我对折叠有类似的反应需求,并且无法修改 AvalonEdit 以适应我的解决方案。在我的应用程序中,我并不真正关心“什么”被折叠,只是如果有任何东西被折叠或展开,我需要重新运行一些数据检查。 我发现我可以添加一个点击处理程序,这样折叠边距中的任何点击都可以触发我想要的。有可能过度触发(任何鼠标左键按下都会触发它),但我的操作很便宜,所以我不担心额外的调用。

// Get the margin off the editor, if it exists FoldingMargin_foldingMargin = Editor.TextArea.LeftMargins.OfType<FoldingMargin>().FirstOrDefault(); // if we have a margin, add a mouse event to it if (_foldingMargin != null) { _foldingMargin.MouseLeftButtonDown += foldingMargin_MouseLeftButtonDown; }

请确保仅在实际安装边距后才执行此操作,否则边距将不存在。在我的例子中,鼠标事件非常简单,只需一个函数调用,但您可以将您需要的任何内容放在那里。希望这对可能有类似情况的人有所帮助。


1
投票

FoldingManager 将创建一个 TextSegmentCollection

。使用 FoldingManager.AllFoldings,即使状态为 IsFolded,您也应该能够看到所有折叠。但不可能从用户控件外部进行设置。所以你必须改变原始来源。

AvalonEdit 的团队似乎不再真正更新该项目了...目前我正在以 AvalonEdit 为基础开发我的版本。也许我也会找到时间来实现这个功能,但这可能需要时间......所以当你可以自己解决你的问题时,请告诉我:)


0
投票

.. public sealed class FoldingSection : TextSegment { .. public Action<bool> MyAction { get; set; } .. public bool IsFolded { get { return isFolded; } set { if (isFolded != value) { .. MyAction?.Invoke(value);

以及使用代码的某个地方:

foreach (var folding in myFoldingManager.AllFoldings) folding.MyAction = ..

© www.soinside.com 2019 - 2024. All rights reserved.