C# полосы прокрутки украшений?

При написании расширения для Visual Studio, есть ли способ повлиять на то, как оно отображает полосу прокрутки в режиме карты для C#?

1 ответ

Решение

У меня нет времени на полный ответ, но я напишу короткий, потому что в нуле есть информация о нуле:

  1. Создать решение VSIX.
  2. Добавьте элемент и в категории "Расширяемость" выберите "Редактор полей"
  3. В файле "[yourEditorMarginName]Factory.cs", который был создан рядом с файлом маржи после выполнения шага 2, установите следующие строки:

        [MarginContainer(PredefinedMarginNames.VerticalScrollBar)]
        [Order(Before = PredefinedMarginNames.LineNumber)]
    
  4. Вернитесь к файлу "[yourEditorMarginName].cs". Убедитесь, что вы удалили следующие строки в конструкторе:

        this.Height = 20;
        this.ClipToBounds = true;
        this.Width = 200;
    
  5. Теперь вы получили ссылку на IWpfTextView внутри конструктора, зарегистрируйтесь в его событии OnLayoutChanged (или используйте другое подходящее вам событие):

        TextView.LayoutChanged += OnLayoutChanged;
    
  6. В OnLayoutChanged вы можете сделать следующее, чтобы добавить украшение прямоугольника:

        var rect = new Rectangle();
        double bottom;
        double firstLineTop;
        MapLineToPixels([someLineYouNeedToHighlight], out firstLineTop, out bottom);
        SetTop(rect, firstLineTop);
        SetLeft(rect, 0);
        rect.Height = bottom - firstLineTop;
        rect.Width = [yourWidth];
        Color color = [your Color];
        rect.Fill = new SolidColorBrush(color);
    
        Children.Add(rect);
    
  7. А вот MapLineToPixels():

        private void MapLineToPixels(ITextSnapshotLine line, out double top, out double bottom)
        {
        double mapTop = ScrollBar.Map.GetCoordinateAtBufferPosition(line.Start) - 0.5;
        double mapBottom = ScrollBar.Map.GetCoordinateAtBufferPosition(line.End) + 0.5;
        top = Math.Round(ScrollBar.GetYCoordinateOfScrollMapPosition(mapTop)) - 2.0;
        bottom = Math.Round(ScrollBar.GetYCoordinateOfScrollMapPosition(mapBottom)) + 2.0;
        }
    
  8. Ага ScrollBar переменная это то, что вы можете получить следующим образом:

        ScrollBar = (IVerticalScrollBar)scrollBarMargin;
    
Другие вопросы по тегам