我正在使用 VS 2010 为 Excel 加载项创建自定义任务面板。我希望任务窗格始终对用户可见,因此无法关闭、移动或调整大小。
有没有办法在任务窗格的标题栏中禁用这些功能?也许通过禁用右上角的关闭框和向下箭头按钮?
谢谢
我正在使用 VS 2010 为 Excel 加载项创建自定义任务面板。我希望任务窗格始终对用户可见,因此无法关闭、移动或调整大小。
有没有办法在任务窗格的标题栏中禁用这些功能?也许通过禁用右上角的关闭框和向下箭头按钮?
谢谢
要停止关闭自定义任务窗格:
当用户按下关闭按钮时,结果是自定义窗格的 Visible 属性设置为 false。这会触发自定义窗格的 VisibleChanged 事件。在该事件的处理程序中,您可以强制重新打开自定义任务窗格。
private static void OnVisibleChanged(object sender, EventArgs e)
{
var customTaskPane = sender as CustomTaskPane;
if (customTaskPane != null)
{
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() => { customTaskPane.Visible = true; }));
}
}
请注意,我使用的是 Dispatcher 的 BeginInvoke 方法。这是因为如果您尝试直接将自定义窗格的 Visible 属性设置为 true,而不使用 Dispatcher,则会引发异常,因为在事件处理程序中不允许这样做。使用 BeginInvoke 方法会导致分配异步执行,从而解决该限制。
要停止调整自定义任务窗格的大小:
为此,您需要将 SizeChanged 事件处理程序附加到自定义任务窗格的 UserControl。例如:
var sampleHostControl = new WpfHostControl(Globals.AddIn.SamplePaneWpfControl);
_samplePane = this.CustomTaskPanes.Add(sampleHostControl, "Sample");
sampleHostControl.SizeChanged += new EventHandler(OnHostControlSizeChanged);
在事件处理程序中,您可以重置 _samplePane 的高度。
private const int PaneHeight = 52;
private void OnHostControlSizeChanged(object sender, EventArgs e)
{
if (_samplePane != null && _samplePane.Height != PaneHeight)
{
System.Windows.Forms.SendKeys.Send("{ESC}");
_samplePane.Height = PaneHeight;
}
}
SendKeys.Send 的使用来自这个msdn 论坛帖子。Microsoft 版主指示 SendKeys.Send 停止调整大小操作。if 语句中的高度比较确保我们只防止垂直高度变化;如果用户想要水平扩展或缩小 Excel,我们不应该阻止它。
您可以指定任务窗格的停靠并锁定它,以便用户无法通过这种方式修改其位置:
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
var taskPaneContainer = new TaskPaneContainer();
var taskPane = this.CustomTaskPanes.Add(taskPaneContainer, "My Task Pane");
taskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionRight;
taskPane.DockPositionRestrict = MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
taskPane.Visible = true;
}
另一方面,据我所知,不可能直接阻止用户使 TaskPane 不可见。您最好的选择可能是在功能区中添加一个按钮以使 TaskPane 再次可见。