Visual Studio украшение перед текстом мешает выделению

На прошлой неделе я решил создать расширение Visual Studio для измерения покрытия кода C++. По сути, я нуждался в этом сам для своей повседневной работы. Я придумал проект, который можно найти по https://github.com/atlaste/CPPCoverage.

Большинство работает нормально. Однако у меня есть некоторые проблемы со слоями украшений:

Одной из особенностей проекта является создание подсветки (не) покрытого кода. Подсветка сама по себе работает нормально, но, похоже, мешает выделению кода в Visual Studio:

Демонстрация вопроса

Соответствующий код, который отвечает за выделение:

private void HighlightCoverage(CoverageState[] coverdata, ITextViewLine line)
{
    IWpfTextViewLineCollection textViewLines = view.TextViewLines;

    int lineno = 1 + view.TextSnapshot.GetLineNumberFromPosition(line.Extent.Start);

    CoverageState covered = lineno < coverdata.Length ?
                            coverdata[lineno] : CoverageState.Irrelevant;

    if (covered != CoverageState.Irrelevant)
    {
        SnapshotSpan span = new SnapshotSpan(view.TextSnapshot, 
                                    Span.FromBounds(line.Start, line.End));
        Geometry g = textViewLines.GetMarkerGeometry(span);
        if (g != null)
        {
            GeometryDrawing drawing = (covered == CoverageState.Covered) ?
                new GeometryDrawing(coveredBrush, coveredPen, g) :
                new GeometryDrawing(uncoveredBrush, uncoveredPen, g);

            drawing.Freeze();

            DrawingImage drawingImage = new DrawingImage(drawing);
            drawingImage.Freeze();

            Image image = new Image();
            image.Source = drawingImage;

            //Align the image with the top of the bounds of the text geometry
            Canvas.SetLeft(image, g.Bounds.Left);
            Canvas.SetTop(image, g.Bounds.Top);

            layer.AddAdornment(AdornmentPositioningBehavior.TextRelative, 
                               span, null, image, null);
        }
    }
}

Полный фрагмент кода с правильным контекстом можно найти здесь: https://github.com/atlaste/CPPCoverage/blob/master/CoverageExt/CodeRendering/CodeCoverage.cs.

Q: Может кто-нибудь сказать мне, как визуализировать блоки на заднем плане, а не на переднем плане?

1 ответ

Решение

Спросил 7 лет назад и до сих пор рядом с ZERO есть информация об украшениях и расширении Visual Studio в сети.

Вот как вы это делаете:

  1. Когда вы создаете экземпляр класса TextAdornment с помощью мастера VS (например: щелкните правой кнопкой мыши на проекте => Добавить элемент), вы получите два файла: первый - это класс с выбранным вами именем, а другой -

    [NameYouPicked]TextViewCreationListener.cs

  2. Найдите этот файл в обозревателе решений и откройте его.

  3. Перейти к определению вашего украшения. Это должно выглядеть так:
/// <summary>
/// Defines the adornment layer for the adornment. This layer is ordered
/// after the selection layer in the Z-order
/// </summary>
[Export(typeof(AdornmentLayerDefinition))]
[Name("TextAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
private AdornmentLayerDefinition editorAdornmentLayer;
  1. Как вы можете видеть, установлен порядок после выбора. Я не знаю, какой слой самый ранний, но я изменяю код таким образом, чтобы предотвратить нежелательные столкновения:
  [Order(Before = PredefinedAdornmentLayers.BraceCompletion)]
Другие вопросы по тегам