ドキュメントを管理するためにAvalonEditに依存しているプロジェクトに取り組んでいます。このドキュメントの特定の行には、 AvalonEdit内から変更できない特定のインデントを使用するようにフラグが付けられています。
VisualLineElements
これらのフラグ付き行の開始時に挿入されることで、これを達成することができました。視覚要素にはDocumentLength
、インデントのサイズとサイズがあります0
。VisualLength
またGetNextCaretPosition
、キャレットを左側VisualLineElement
(後方への移動の場合) または右側 (前方への移動の場合) に「プッシュ」する方法を上書きしました。
これは、フォーマットが縮小されたバージョンの myVisualLineElement
です (要素は常に に挿入されることに注意してくださいVisualColumn == 0
) :
public class MyLineFormatElement : VisualLineElement
{
private readonly string _elementText;
public MyLineFormatElement (string elementText)
: base(elementText.Length, 0)
{
_elementText = elementText;
}
public override bool CanSplit
{
get
{
return false;
}
}
public override int GetNextCaretPosition(int visualColumn, System.Windows.Documents.LogicalDirection direction, ICSharpCode.AvalonEdit.Document.CaretPositioningMode mode)
{
if (visualColumn >= VisualColumn && visualColumn <= VisualColumn + VisualLength)
{
return direction == LogicalDirection.Forward ? VisualColumn + VisualLength : VisualColumn;
}
return base.GetNextCaretPosition(visualColumn, direction, mode);
}
public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context)
{
return new TextCharacters(_elementText, TextRunProperties);
}
}
これは、私が抱えている1つの問題を除いてうまく機能します.キャレットを行の先頭に配置できます. ユーザーの観点からは、これは非常に紛らわしいものです。さらに悪いことに、行の先頭で「削除」を押したり、インデントの最後で「バックスペース」を押したりすると、変更を加えることなく単にキャレットが移動します。私が理解しているように、キャレットを行頭に配置できなければ、削除/バックスペースの問題は解決されます ( のコードに基づくCaretNavigationCommandHandler.OnMoveCaret
)。
これを修正する方法についての私の最善の推測は、true を返すようにプロパティをオーバーライドしてから、HandlesLineBorders
次のように変更GetNextCaretPosition
することですreturn VisualColumn + VisualLength
。前の行の最後の視覚的な列(これを行う方法がわかりません)
#2の最後の部分は可能ですか?もしそうなら、どうすればいいですか?そうでない場合、私が試すべき他のアプローチはありますか? VisualLineElements
ドキュメントの実際のコンテンツとそれがレンダリングされる方法との間の明確な分離を維持するために、私は本当に固執したいと思います.