我已成功将折叠添加到我的
AvalonEdit
文档中,但是,为了获得真正有用的体验,我需要存储折叠状态,以便下次用户打开文档时,折叠状态会恢复。
我的问题是如何知道
FoldSection
何时被用户折叠,例如单击时? 此类不通知属性更改。我找不到任何事件来改变折叠状态。
我知道这已经很旧了,这并不完全是您正在寻找的,但我对折叠有类似的反应需求,并且无法修改 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;
}
请确保仅在实际安装边距后才执行此操作,否则边距将不存在。在我的例子中,鼠标事件非常简单,只需一个函数调用,但您可以将您需要的任何内容放在那里。希望这对可能有类似情况的人有所帮助。
FoldingManager 将创建一个 TextSegmentCollection
。使用 FoldingManager.AllFoldings,即使状态为 IsFolded,您也应该能够看到所有折叠。但不可能从用户控件外部进行设置。所以你必须改变原始来源。
..
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 = ..