2

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

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

谢谢

4

2 回答 2

6

要停止关闭自定义任务窗格:

当用户按下关闭按钮时,结果是自定义窗格的 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,我们不应该阻止它。

于 2012-06-18T23:41:25.500 回答
5

您可以指定任务窗格的停靠并锁定它,以便用户无法通过这种方式修改其位置:

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 再次可见。

于 2012-06-02T03:10:21.030 回答