新しい余白を使用して Visual Studio エディターを拡張する
テキスト ビューの余白は余白コンテナーに配置され (ContainerMarginPlacement.KnownValuesを参照)、他の余白の前後に並べ替えられます (「MarginPlacement.KnownValuesを参照してください)。
テキストビューの余白プロバイダーは、ITextViewMarginProvider インターフェースを実装し、TextViewMarginProviderConfiguration を用いて提供する余白を構成します。そして、CreateVisualElementAsyncを使用し、アクティブ化された際に余白内でホストされるUIコントロールを提供します。
VisualStudio.Extensibility の拡張機能は Visual Studio からアウトプロセスになる可能性があるため、テキスト ビューの余白のコンテンツのプレゼンテーション レイヤーとして WPF を直接使用することはできません。 代わりに、テキスト ビューの余白にコンテンツを提供するには、RemoteUserControl とそのコントロールの対応するデータ テンプレートを作成する必要があります。 以下に簡単な例がいくつかありますが、テキスト ビューの余白 UI コンテンツを作成するときに リモート UI のドキュメントを読むことをお勧めします。
/// <summary>
/// Configures the margin to be placed to the left of built-in Visual Studio line number margin.
/// </summary>
public TextViewMarginProviderConfiguration TextViewMarginProviderConfiguration => new(marginContainer: ContainerMarginPlacement.KnownValues.BottomRightCorner)
{
Before = new[] { MarginPlacement.KnownValues.RowMargin },
};
/// <summary>
/// Creates a remotable visual element representing the content of the margin.
/// </summary>
public async Task<IRemoteUserControl> CreateVisualElementAsync(ITextViewSnapshot textView, CancellationToken cancellationToken)
{
var documentSnapshot = await textView.GetTextDocumentAsync(cancellationToken);
var dataModel = new WordCountData();
dataModel.WordCount = CountWords(documentSnapshot);
this.dataModels[textView.Uri] = dataModel;
return new MyMarginContent(dataModel);
}
余白の配置を設定するだけでなく、テキスト ビューの余白プロバイダーは、GridCellLength プロパティと GridUnitType プロパティを使用して、余白を配置すべきグリッド セルのサイズを構成することもできます。
通常、テキスト ビューの余白はテキスト ビューに関連するデータ (現在の行番号やエラーの数など) を視覚化するため、ほとんどのテキスト ビューの余白プロバイダーは、テキスト ビューを開いて閉じることやユーザーの入力に対応するために、テキスト ビュー イベントをリッスンする必要があります。
Visual Studio では、ユーザーが開く適用可能なテキスト ビューの数に関係なく、テキスト ビューの余白プロバイダーのインスタンスが 1 つだけ作成されるため、余白にステートフル データが表示される場合は、プロバイダーが現在開いているテキスト ビューの状態を維持する必要があります。
詳細については、ワードカウント余白サンプルを参照してください。
テキスト ビューの行に合わせてコンテンツを配置する必要がある縦書きテキスト ビューの余白はまだサポートされていません。