首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AvalonEdit中的BraceFolding

AvalonEdit中的BraceFolding
EN

Stack Overflow用户
提问于 2011-03-09 21:27:17
回答 1查看 4.7K关注 0票数 3

我使用Daniel Grünwald的BraceFoldingStrategy:

代码语言:javascript
复制
public IEnumerable<NewFolding> CreateNewFoldings(ITextSource document)
        {
            List<NewFolding> newFoldings = new List<NewFolding>();

            Stack<int> startOffsets = new Stack<int>();
            int lastNewLineOffset = 0;
            char openingBrace = this.OpeningBrace;
            char closingBrace = this.ClosingBrace;
            for (int i = 0; i < document.TextLength; i++) {
                char c = document.GetCharAt(i);
                if (c == openingBrace) {
                    startOffsets.Push(i);
                } else if (c == closingBrace && startOffsets.Count > 0) {
                    int startOffset = startOffsets.Pop();
                    // don't fold if opening and closing brace are on the same line
                    if (startOffset < lastNewLineOffset) {
                        newFoldings.Add(new NewFolding(startOffset, i + 1));
                    }
                } else if (c == '\n' || c == '\r') {
                    lastNewLineOffset = i + 1;
                }
            }
            newFoldings.Sort((a,b) => a.StartOffset.CompareTo(b.StartOffset));
            return newFoldings;
        }

这可以正常工作,但仍然存在一个问题

在最后一个大括号上总是有一个最后一个图标。我试图删除它,但当我查看列表newFoldings时,我可以看到那里只有3个折叠。那么第四个是从哪里来的?

编辑

根据Daniel Grünwald的说法,问题是我必须使用不同的折叠管理器。但是,我在初始化代码中找不到任何设置第二个FoldingManager的语句。也许有什么提示?

代码语言:javascript
复制
private void textEditor_Loaded(object sender, RoutedEventArgs e)
{
   LoadSourceCode();
   textEditor.Background = Brushes.Green;  
   textEditor.IsReadOnly = true;    
   textEditor.ShowLineNumbers = true;

   using (Stream s = this.GetType().Assembly.GetManifestResourceStream("Prototype_Concept_2.View.Layouts.CustomHighlighting.xshd"))
   {
      using (XmlTextReader reader = new XmlTextReader(s))
      {    
         textEditor.SyntaxHighlighting = HighlightingLoader.Load(reader, HighlightingManager.Instance);
      }
    }

   (textEditor.TextArea as IScrollInfo).ScrollOwner.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
   (textEditor.TextArea as IScrollInfo).ScrollOwner.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;

   FoldingManager foldingManager = FoldingManager.Install(textEditor.TextArea);    
   BraceFoldingStrategy foldingStrategy = new BraceFoldingStrategy();    
   foldingStrategy.UpdateFoldings(foldingManager, textEditor.Document);

   TextArea txt = textEditor.TextArea;    
   ObservableCollection<UIElement> margins = txt.LeftMargins;

   foreach (UIElement margin in margins)    
   {    
      if ((margin as FoldingMargin) != null)
      {
         Contacts.AddPreviewContactDownHandler(margin as FoldingMargin, OnDown);
      }
   }

   Main.Children.Remove(textEditor);
   ScrollHost.Width = textEditor.Width;    
   ScrollHost.Height = textEditor.Height;    
   ScrollHost.Content = textEditor;
   textEditor.Background = Brushes.Transparent;
   ScrollHost.Background = Brushes.Transparent;    
}

编辑2

我检查了当前安装的FoldingManager有3个折叠,但我仍然不知道第四个折叠是在哪里定义的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-10 00:00:16

简单的BraceFoldingStrategy在我的经验中太多错误,没有真正的用处。有很多问题,比如折断缩进(每次在AvalonDock中改变制表符时,我都会得到额外的折叠边距--这可能就是你面临的相同问题),字符串中的花括号被解析为普通的花括号(它甚至能够将字符串{与real }配对)等等,所以我决定放弃它。

真正的代码折叠支持需要真正的词法(或更好的语法)分析信息,如果可以使用这些信息(您可以在SharpDevelop 4.0源代码中找到用法示例),但您必须能够访问为其编写编辑器的语言的解析器。

我认为代码折叠不是IDE最重要的功能,我个人很少使用它(只有在具有区域/大型方法的非常大的文件中)。

我知道这不是你想要的答案(如果这篇文章没有超过长度限制,我会把它作为评论发表)。不过,我会继续关注这一点(并希望有人能提供一个真正的答案)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5246467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档