每次我在 Visual Studio (2005) 中查看表单或对话框时,“属性”和“工具箱”窗格都会显示在屏幕右侧。 这是很好的,因为它们对于操作对话框很有用。
但是,一旦我切换回源代码,这些窗格就会妨碍......有没有办法让它们自动消失?
我最近在 VS2010 中使用宏做了一些事情,该宏在 asp.net MVC3 视图中从代码视图来回切换到设计视图时显示和隐藏“工具”面板。我认为它可以很容易地适应你的情况。
这会出现在 VS Macro IDE 中预生成内容之后的
EnvironmentEvents
类文件中。
<System.ContextStaticAttribute()> Public WithEvents CommandEvents As EnvDTE.CommandEvents
Public Sub DTEEvents_OnMacrosRuntimeReset() Handles _
DTEEvents.OnMacrosRuntimeReset
CommandEvents = DTE.Events.CommandEvents
End Sub
Private Sub DTEEvents_OnStartupComplete() Handles _
DTEEvents.OnStartupComplete
CommandEvents = DTE.Events.CommandEvents
End Sub
Public Sub CommandEvents_AfterExecute( _
ByVal Guid As String, _
ByVal ID As Integer, _
ByVal CustomIn As Object, _
ByVal CustomOut As Object) _
Handles CommandEvents.AfterExecute
If DTE.Commands.Item(Guid, ID).Name = "View.ViewDesigner" Then
DTE.ExecuteCommand("View.Toolbox")
End If
If DTE.Commands.Item(Guid, ID).Name = "View.ViewMarkup" Then
DTE.Windows.Item(Constants.vsWindowKindToolbox).Close()
End If
End Sub
使用事件的指导而不是 if 语句可能可以更好地优化它。当您使用热键切换视图以及视图菜单时,它可以工作,但不能使用上下文菜单。
edit_2024:我在这里的最新答案:https://stackoverflow.com/a/47554393/3137362
支持VS: vs2015、vs2017、vs2019 .
支持的项目: Winforms 、 WPF 、 Xamarin.Android .
旧答案:
对于 vs2015:
using EnvDTE;
using EnvDTE80;
public class E : VisualCommanderExt.IExtension
{
private EnvDTE80.DTE2 DTE;
private EnvDTE.WindowEvents windowEvents;
public void SetSite(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) {
this.DTE = DTE;
DTE.Events.WindowEvents.WindowActivated += OnWindowActivated;
}
public void Close() {
// i read somewhere this has to be done on close.
// but it gives gives me error on every IDE close. so i commented it .
//DTE.Events.WindowEvents.WindowActivated -= OnWindowActivated;
}
private void OnWindowActivated(Window gotFocus, Window lostFocus) {
HidePropertiesWindowInCodeOrTextView(gotFocus );
}
public void HidePropertiesWindowInCodeOrTextView(Window gotFocus ) {
if (gotFocus.Document == null) return;
var pwin = DTE.Windows.Item(Constants.vsWindowKindProperties);
pwin.AutoHides = !gotFocus.Caption.EndsWith(" [Design]") ;
}
}
我没有放弃屏幕右侧的空间,而是将属性和工具箱窗格拖到托管解决方案资源管理器和类视图等的左侧框架。我宁愿拥有一个多功能框在屏幕的一侧而不是将代码包围起来。 如果您需要它们,您可以将工具箱放在解决方案资源管理器窗格中,然后将属性窗格堆叠在解决方案资源管理器下方,这样可以始终与工具箱一起查看一些属性。
我知道这并不完全是您正在寻找的答案,但这是一种保持屏幕空间可用于代码而不干扰自动隐藏的不同方式(我发现自动隐藏实际上是一种烦恼而不是帮助。)
对于 vs2019:
我改进了bh_earth0的解决方案。现在,当您跳转到代码时,它会保存属性和工具箱的可见性状态。当设计选项卡被激活时,它会加载窗格的先前状态。
菜单 > 扩展 > 管理扩展
找到并安装“Visual Commander”。 (现在您有名为“VCmd”的新菜单)
菜单 >“VCmd”> 扩展...(您将在右侧看到扩展窗格)
按扩展窗格中的添加按钮。 (新选项卡窗口将打开。)
写下扩展名(例如 AutoHide)。
选择语言为C#。
复制并粘贴以下代码:
按“保存”。然后按编译。然后按安装
重新启动 Visual Studio 并享受 :-)
using EnvDTE;
using EnvDTE80;
public class E : VisualCommanderExt.IExtension
{
private EnvDTE80.DTE2 DTE;
private EnvDTE.WindowEvents windowEvents;
private bool bPropWinVisible = false;
private bool bToolWinVisible = false;
public void SetSite(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) {
this.DTE = DTE;
DTE.Events.WindowEvents.WindowActivated += OnWindowActivated;
}
public void Close() {
}
private void OnWindowActivated(Window gotFocus, Window lostFocus) {
if (gotFocus.Document == null) return;
if (lostFocus.Document == null) return;
var pwin = DTE.Windows.Item(Constants.vsWindowKindProperties);
var twin = DTE.Windows.Item(Constants.vsWindowKindToolbox);
if(gotFocus.Caption.EndsWith(".cs [Design]") && lostFocus.Caption.EndsWith(".cs") ) {
pwin.AutoHides = bPropWinVisible;
twin.AutoHides = bToolWinVisible;
}
else if(gotFocus.Caption.EndsWith(".cs") && lostFocus.Caption.EndsWith(".cs [Design]")) {
bPropWinVisible = pwin.AutoHides;
bToolWinVisible = twin.AutoHides;
pwin.AutoHides = true;
twin.AutoHides = true;
}
}
}
如果单击这些工具窗口上的“固定”图标,您可以切换窗口是否始终保持打开状态,或者仅当鼠标靠近它们时。 当然,有时我的鼠标会朝那个方向移动,当我不希望它们弹出时,它们就会弹出,但这就是生活......