是否可以阻止用户关闭、移动自定义 Excel 任务窗格或调整其大小

本文关键字:任务 Excel 调整 自定义 移动 用户 是否 | 更新日期: 2023-09-27 18:36:08

我正在使用VS 2010为Excel加载项创建自定义任务面板。我希望任务窗格始终对用户可见,因此无法关闭、移动或调整其大小。

有没有办法在任务窗格的标题栏中禁用这些功能?也许通过禁用右上角的关闭框和向下箭头按钮?

谢谢

是否可以阻止用户关闭、移动自定义 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; }));
    }
}

请注意,我使用的是调度程序的 BeginInvoke 方法。这是因为,如果尝试直接将自定义窗格的 Visible 属性设置为 true,而不使用调度程序,则会引发异常,因为事件处理程序中不允许这样做。使用 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;
}
另一方面,据

我所知,不可能直接阻止用户使任务窗格不可见。最好的办法可能是在功能区中添加一个按钮,以使任务窗格再次可见。