Daniel Grünwald による BraceFoldingStrategy を使用します。
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;
}
これは期待どおりに機能しますが、1 つの問題が残っています
最後のブレースには常に最後の - アイコンがあります。私はそれを削除しようとしましたが、リスト newFoldings を見ると、折り畳みが 3 つしかないことがわかります。では、4番目はどこから来るのでしょうか?
編集
Daniel Grünwald によると、問題は、さまざまな折り畳みマネージャーを使用しなければならないことです。ただし、初期化コードで 2 番目の FolderingManager を設定するステートメントが見つかりません。多分ヒント?
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つの折りたたみがあることを確認しましたが、4番目の折りたたみがどこに定義されているかはまだわかりません。