我创建了一个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();
}));
答案 0 :(得分:2)
你所拥有的代码就是如果你在一个软件包中,并且你正在试图找出当前活动的视图......这对你正在尝试做的事情来说太过分了。
假设您从TextAdornment模板开始,装饰对象在构造函数中被赋予IWpfTextView。 (如果没有,你可能有IWpfTextCreationListener.TextViewCreated
的实现,它需要通过它。)IWpfTextView派生ITextView,它有一个属性ITextBuffer。从这里,您可以调用CreateEdit()并从那里编辑文本。