Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以阻止用户关闭、移动或调整自定义Excel任务窗格的大小吗?_C#_Vsto_Excel Addins - Fatal编程技术网

C# 我可以阻止用户关闭、移动或调整自定义Excel任务窗格的大小吗?

C# 我可以阻止用户关闭、移动或调整自定义Excel任务窗格的大小吗?,c#,vsto,excel-addins,C#,Vsto,Excel Addins,我正在使用VS2010为Excel加载项创建自定义任务面板。我希望任务窗格始终对用户可见,因此无法关闭、移动或调整大小 有没有办法在任务窗格的标题栏中禁用这些功能?也许是通过禁用关闭框和右上角的向下箭头按钮 谢谢您可以指定任务窗格的停靠并将其锁定,以便用户无法通过以下方式修改其位置: private void ThisAddIn_Startup(object sender, System.EventArgs e) { var taskPaneContainer = new TaskPane

我正在使用VS2010为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;
}

另一方面,据我所知,不可能直接阻止用户使任务窗格不可见。您最好在功能区中添加一个按钮,使任务窗格再次可见。

要阻止关闭自定义任务窗格,请执行以下操作:

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

虽然这种方法确实可以阻止任务窗格被移动,但有没有办法阻止它垂直重新调整大小?这里的背景是,我找不到将WinForms或WPF控件添加到Excel状态栏的方法。因此,我想添加一个自定义任务窗格,它的行为类似于状态栏,并允许我显示自己的控件。请确保我理解:您希望在底部有一个任务窗格(类似于状态栏),并且用户不能更改其高度,对吗?它本身不一定是任务窗格,但我正在寻找一些方法来添加我自己的状态栏(或类似状态栏的)控件。在阅读了一些资料之后,似乎使用CustomTaskPane是我最好的选择,因为它允许我添加自定义控件。但是,我希望CustomTaskPane的行为也尽可能像一个实际的状态栏(无法关闭或调整大小,并固定到应用程序的底部)。+1这是一个各种解决方案的伟大组合,可以同时实现窗格关闭和窗格调整大小。谢谢