2

我按照此页面中的步骤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();
        }));
4

1 回答 1

2

如果您在一个包中并且您正在尝试找出当前处于活动状态的视图,那么您拥有的代码是......这对于您正在尝试做的事情来说太过分了。

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

于 2012-12-09T19:52:14.893 回答