我可以阻止用户关闭,移动或调整自定义Excel任务窗格吗?

Cra*_*aig 2 c# vsto excel-addins

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

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

谢谢

Cra*_*aig 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; }));
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用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);
Run Code Online (Sandbox Code Playgroud)

在事件处理程序中,您可以重置_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;
    }
}
Run Code Online (Sandbox Code Playgroud)

SendKeys.Send的使用来自这个 msdn论坛帖子.Microsoft Moderator指示SendKeys.Send停止重新调整大小操作.if语句中的高度比较确保我们防止垂直高度变化; 如果用户想要水平扩展或缩小Excel,我们不应该阻止它.


Mat*_*ias 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;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,据我所知,不可能直接阻止用户使TaskPane不可见.您最好的选择可能是在功能区中添加一个按钮以使TaskPane再次可见.