Rozszerzanie edytora programu Visual Studio przy użyciu nowego marginesu
Marginesy widoku tekstu są umieszczane w kontenerze marginesów (zobacz ContainerMarginPlacement.KnownValues) i uporządkowane przed lub po względem innych marginesów (zobacz MarginPlacement.KnownValues).
Dostawcy marginesu widoku tekstu implementują interfejs ITextViewMarginProvider, konfigurując udostępniany margines poprzez implementację TextViewMarginProviderConfiguration. Po aktywowaniu dostarczają kontrolkę interfejsu użytkownika, która jest osadzana na marginesie za pośrednictwem CreateVisualElementAsync.
Ponieważ rozszerzenia w programie VisualStudio.Extensibility mogą być poza procesem z poziomu programu Visual Studio, nie możemy bezpośrednio używać platformy WPF jako warstwy prezentacji dla zawartości marginesów widoku tekstu. Zamiast tego podanie zawartości do marginesu widoku tekstowego wymaga utworzenia RemoteUserControl i odpowiedniego szablonu danych dla tej kontrolki. Chociaż poniżej przedstawiono kilka prostych przykładów, zalecamy przeczytanie dokumentacji zdalnego interfejsu użytkownika podczas tworzenia zawartości interfejsu użytkownika marginesu widoku tekstu.
/// <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);
}
Oprócz konfigurowania miejsca umieszczenia marginesu, dostawcy marginesów widoku tekstu mogą również skonfigurować rozmiar komórki siatki, w której margines ma być umieszczony, używając właściwości GridCellLength i GridUnitType.
Marginesy widoku tekstu zwykle wizualizować niektóre dane związane z widokiem tekstowym (na przykład bieżący numer wiersza lub liczba błędów), więc większość dostawców marginesów widoku tekstu chce również nasłuchiwać zdarzeń widoku tekstu reagować na otwieranie, zamykanie widoków tekstowych i wpisywanie przez użytkownika.
Program Visual Studio tworzy tylko jedno wystąpienie dostawcy marginesu widoku tekstu niezależnie od liczby widoków tekstu otwieranych przez użytkownika, więc jeśli margines wyświetla pewne dane stanowe, dostawca musi zachować stan aktualnie otwartych widoków tekstowych.
Aby uzyskać więcej informacji, zobacz przykład marginesu liczby słów.
Pionowe marginesy widoku tekstu, których zawartość musi być wyrównana z linijkami widoku tekstu, nie są jeszcze obsługiwane.