如何根据 IWpfTextViewCreationListener 的条件关闭 IWpfTextView - VsTextViewCreated
How to close a IWpfTextView based on a condition from the IWpfTextViewCreationListener - VsTextViewCreated
我有一个 class 监听 IWpfTextViewCreationListener
using System.ComponentModel.Composition;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Editor;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.TextManager.Interop;
using Microsoft.VisualStudio.Utilities;
using Microsoft.VisualStudio.OLE.Interop;
namespace GoToSequence
{
[Export(typeof(IVsTextViewCreationListener))]
[ContentType("Code")]
[TextViewRole(PredefinedTextViewRoles.Editable)]
internal class GoToSequenceEditorCreationListener : IVsTextViewCreationListener
{
[Import(typeof(IVsEditorAdaptersFactoryService))]
internal IVsEditorAdaptersFactoryService editorFactory = null;
public void VsTextViewCreated(IVsTextView textViewAdapter)
{
IWpfTextView textView = editorFactory.GetWpfTextView(textViewAdapter);
if (textView == null)
return;
AddCommandFilter(textViewAdapter, new GoToSequenceCommandHandler(textView, textViewAdapter));
}
void AddCommandFilter(IVsTextView viewAdapter, GoToSequenceCommandHandler commandFilter)
{
if (commandFilter.m_added == false)
{
//get the view adapter from the editor factory
IOleCommandTarget next;
int hr = viewAdapter.AddCommandFilter(commandFilter, out next);
if (hr == VSConstants.S_OK)
{
commandFilter.m_added = true;
//you'll need the next target for Exec and QueryStatus
if (next != null)
commandFilter.m_nextTarget = next;
}
}
}
}
}
在函数 - VsTextViewCreated 中,基于特定条件我想关闭文本视图。
If (condition == null)
IWpfTextView.Close()
但是在执行此操作后出现以下错误
System.ObjectDisposedException was unhandled Message: An unhandled
exception of type 'System.ObjectDisposedException' occurred in
Microsoft.VisualStudio.Platform.VSEditor.dll Additional information:
Cannot access a disposed object.
我也试过了
if(condition == null)
IVsTextView.CloseView()
但这也无济于事。以编程方式关闭文本视图的正确方法是什么?
好的...我能够解决上述问题...
var dte2 = (EnvDTE80.DTE2)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.Shell.Interop.SDTE));
Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte2;
Microsoft.VisualStudio.Shell.ServiceProvider serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);
Microsoft.VisualStudio.Shell.Interop.IVsUIHierarchy uiHierarchy;
uint itemID;
Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame windowFrame;
Microsoft.VisualStudio.Shell.VsShellUtilities.IsDocumentOpen(serviceProvider, _iTextDocument.FilePath, Guid.Empty, out uiHierarchy, out itemID, out windowFrame);
windowFrame.CloseFrame((uint)__FRAMECLOSE.FRAMECLOSE_NoSave);
但是,我仍然想知道为什么 IWpfTextView.Close() 或 IVSTextView.CloseView() 不起作用...
我有一个 class 监听 IWpfTextViewCreationListener
using System.ComponentModel.Composition;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.Editor;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.TextManager.Interop;
using Microsoft.VisualStudio.Utilities;
using Microsoft.VisualStudio.OLE.Interop;
namespace GoToSequence
{
[Export(typeof(IVsTextViewCreationListener))]
[ContentType("Code")]
[TextViewRole(PredefinedTextViewRoles.Editable)]
internal class GoToSequenceEditorCreationListener : IVsTextViewCreationListener
{
[Import(typeof(IVsEditorAdaptersFactoryService))]
internal IVsEditorAdaptersFactoryService editorFactory = null;
public void VsTextViewCreated(IVsTextView textViewAdapter)
{
IWpfTextView textView = editorFactory.GetWpfTextView(textViewAdapter);
if (textView == null)
return;
AddCommandFilter(textViewAdapter, new GoToSequenceCommandHandler(textView, textViewAdapter));
}
void AddCommandFilter(IVsTextView viewAdapter, GoToSequenceCommandHandler commandFilter)
{
if (commandFilter.m_added == false)
{
//get the view adapter from the editor factory
IOleCommandTarget next;
int hr = viewAdapter.AddCommandFilter(commandFilter, out next);
if (hr == VSConstants.S_OK)
{
commandFilter.m_added = true;
//you'll need the next target for Exec and QueryStatus
if (next != null)
commandFilter.m_nextTarget = next;
}
}
}
}
}
在函数 - VsTextViewCreated 中,基于特定条件我想关闭文本视图。
If (condition == null)
IWpfTextView.Close()
但是在执行此操作后出现以下错误
System.ObjectDisposedException was unhandled Message: An unhandled exception of type 'System.ObjectDisposedException' occurred in Microsoft.VisualStudio.Platform.VSEditor.dll Additional information: Cannot access a disposed object.
我也试过了
if(condition == null)
IVsTextView.CloseView()
但这也无济于事。以编程方式关闭文本视图的正确方法是什么?
好的...我能够解决上述问题...
var dte2 = (EnvDTE80.DTE2)Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(Microsoft.VisualStudio.Shell.Interop.SDTE));
Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp = (Microsoft.VisualStudio.OLE.Interop.IServiceProvider)dte2;
Microsoft.VisualStudio.Shell.ServiceProvider serviceProvider = new Microsoft.VisualStudio.Shell.ServiceProvider(sp);
Microsoft.VisualStudio.Shell.Interop.IVsUIHierarchy uiHierarchy;
uint itemID;
Microsoft.VisualStudio.Shell.Interop.IVsWindowFrame windowFrame;
Microsoft.VisualStudio.Shell.VsShellUtilities.IsDocumentOpen(serviceProvider, _iTextDocument.FilePath, Guid.Empty, out uiHierarchy, out itemID, out windowFrame);
windowFrame.CloseFrame((uint)__FRAMECLOSE.FRAMECLOSE_NoSave);
但是,我仍然想知道为什么 IWpfTextView.Close() 或 IVSTextView.CloseView() 不起作用...