Show tooltip on hover over text

最后都变了- 提交于 2019-12-02 06:54:20

问题


I want to create extension that allows to show custom message when I hover over a text.

E.g. "test-text" should give tooltip "OK" instead of current "ITrackin..."

I tried to follow https://docs.microsoft.com/en-us/visualstudio/extensibility/walkthrough-displaying-quickinfo-tooltips?view=vs-2019 but people are stating that it is not working and it's quite long way of doing this.

I cannot find any more docs on this. I know how to display it in on-click window/get currently selected text.


回答1:


The sample send by Lance Li-MSFT was really helpful, but in order to get this working I had to spend some time.

Important steps:

  • Import LineAsyncQuickInfoSourceProvider.cs and LineAsyncQuickInfoSource.cs
  • Add reference to System.ComponentModel.Composition by add reference dialog (right click on the project name)
  • Get missing references by installing them using NuGet Package Manager
  • To initialize MEF components, you’ll need to add a new Asset to source.extension.vsixmanifest.
<Assets>
    ...
    <Asset Type = "Microsoft.VisualStudio.MefComponent" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%|" />
</Assets>

LineAsyncQuickInfoSourceProvider.cs

It's just used to display quick info/tooltip.

using Microsoft.VisualStudio.Language.Intellisense;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Utilities;
using System.ComponentModel.Composition;

namespace JSONExtension
{
    [Export(typeof(IAsyncQuickInfoSourceProvider))]
    [Name("Line Async Quick Info Provider")]
    [ContentType("any")]
    [Order]
    internal sealed class LineAsyncQuickInfoSourceProvider : IAsyncQuickInfoSourceProvider
    {
        public IAsyncQuickInfoSource TryCreateQuickInfoSource(ITextBuffer textBuffer) //creates instance of LineAsyncQuickInfoSource for displaying Quick Info
        {  
            return textBuffer.Properties.GetOrCreateSingletonProperty(() => new LineAsyncQuickInfoSource(textBuffer)); //this ensures only one instance per textbuffer is created
        }
    }
}

LineAsyncQuickInfoSource.cs

Here you can customize what you want to display.

using Microsoft.VisualStudio.Language.Intellisense;
using Microsoft.VisualStudio.Language.StandardClassification;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Adornments;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace JSONExtension
{
    internal sealed class LineAsyncQuickInfoSource : IAsyncQuickInfoSource
    {
        private ITextBuffer _textBuffer;

        public LineAsyncQuickInfoSource(ITextBuffer textBuffer)
        {
            _textBuffer = textBuffer;
        }

        // This is called on a background thread.
        public Task<QuickInfoItem> GetQuickInfoItemAsync(IAsyncQuickInfoSession session, CancellationToken cancellationToken)
        {
            var triggerPoint = session.GetTriggerPoint(_textBuffer.CurrentSnapshot);

            if (triggerPoint != null)
            {
                var line = triggerPoint.Value.GetContainingLine();
                var lineSpan = _textBuffer.CurrentSnapshot.CreateTrackingSpan(line.Extent, SpanTrackingMode.EdgeInclusive);
                var text = triggerPoint.Value.GetContainingLine().GetText(); //get whole line of current cursor pos

                ContainerElement dataElm = new ContainerElement(
                ContainerElementStyle.Stacked,
                new ClassifiedTextElement(
                    new ClassifiedTextRun(PredefinedClassificationTypeNames.Keyword, "MESSAGE TO EDIT: " + text.ToString())
                ));
                return Task.FromResult(new QuickInfoItem(lineSpan, dataElm)); //add custom text from above to Quick Info
            }

            return Task.FromResult<QuickInfoItem>(null); //do not add anything to Quick Info
        }
        public void Dispose()
        {
            // This provider does not perform any cleanup.
        }
    }
}


来源:https://stackoverflow.com/questions/57453937/show-tooltip-on-hover-over-text

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!