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 в сети.
Вот как вы это делаете:
Когда вы создаете экземпляр класса TextAdornment с помощью мастера VS (например: щелкните правой кнопкой мыши на проекте => Добавить элемент), вы получите два файла: первый - это класс с выбранным вами именем, а другой -
[NameYouPicked]TextViewCreationListener.cs
Найдите этот файл в обозревателе решений и откройте его.
- Перейти к определению вашего украшения. Это должно выглядеть так:
/// <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;
- Как вы можете видеть, установлен порядок после выбора. Я не знаю, какой слой самый ранний, но я изменяю код таким образом, чтобы предотвратить нежелательные столкновения:
[Order(Before = PredefinedAdornmentLayers.BraceCompletion)]