次の方法で共有


新しい余白を使用して 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 つだけ作成されるため、余白にステートフル データが表示される場合は、プロバイダーが現在開いているテキスト ビューの状態を維持する必要があります。

詳細については、ワードカウント余白サンプルを参照してください。

テキスト ビューの行に合わせてコンテンツを配置する必要がある縦書きテキスト ビューの余白はまだサポートされていません。