如何在Visual Studio的TextAdornment模板中的编辑器中插入文本?

时间:2012-12-09 14:19:30

标签: c# visual-studio visual-studio-extensions

我按照本页http://blogs.msdn.com/b/visualstudio/archive/2009/12/09/building-and-publishing-an-extension-for-visual-studio-2010.aspx

中的步骤操作

我创建了一个TextAdornment项目和一个搜索框。我想在这个页面做一些不同的事情。我想查询链接,获取WPF用户控件中的列表,然后将信息写回编辑器。所以问题是我不知道如何在seachbox(WPF用户控件)中将文本写回编辑器? 我搜索了很多,并找到了使用代码的方法:

IVsTextManager txtMgr = (IVsTextManager)GetService(typeof(SVsTextManager));
        IVsTextView vTextView = null;
        int mustHaveFocus = 1;
        txtMgr.GetActiveView(mustHaveFocus, null, out vTextView);
        IVsUserData userData = vTextView as IVsUserData;
        if (userData == null)
        {
            return null;
        }
        else
        {
            IWpfTextViewHost viewHost;
            object holder;
            Guid guidViewHost = DefGuidList.guidIWpfTextViewHost;
            userData.GetData(ref guidViewHost, out holder);
            viewHost = (IWpfTextViewHost)holder;
            return viewHost;
        }

然而,方法“GetService”也说未找到。我认为原因是这种方法适用于VSPackage。它不适合装饰项目。

请帮助指出如何从WPF用户控件将文本写回编辑器。谢谢!

=============================================== =======================================

解决方案: 在创建SearchBox(WPF用户控件)时,将IWpfTextView传递给WPF控件。然后,可以在SearchBox.xaml.cs中使用它。还需要注意使用Dispatcher函数来保持UI线程是活动的。

Dispatcher.Invoke(new Action(() =>
        {

            ITextEdit edit = _view.TextBuffer.CreateEdit();
            ITextSnapshot snapshot = edit.Snapshot;

            int position = snapshot.GetText().IndexOf("gist:");
            edit.Delete(position, 5);
            edit.Insert(position, "billmo");
            edit.Apply();
        }));

1 个答案:

答案 0 :(得分:2)

你所拥有的代码就是如果你在一个软件包中,并且你正在试图找出当前活动的视图......这对你正在尝试做的事情来说太过分了。

假设您从TextAdornment模板开始,装饰对象在构造函数中被赋予IWpfTextView。 (如果没有,你可能有IWpfTextCreationListener.TextViewCreated的实现,它需要通过它。)IWpfTextView派生ITextView,它有一个属性ITextBuffer。从这里,您可以调用CreateEdit()并从那里编辑文本。