Word VSTO加载项:如何设置自定义任务窗格的宽度?

时间:2018-05-22 09:07:44

标签: c# .net winforms vsto

我设计了一个UserControl对象来实现我的Word加载项的UI。在运行时,当用户打开任务窗格时,我将该UserControl的实例添加到活动窗口(通过CustomTaskPanes集合),将其Visible属性设置为true,然后看,我得到了我的任务窗格......除了被截断之外,我只看到左边70%,我需要手动调整任务窗格的大小以完整地查看UserControl。

首先,我不明白为什么任务窗格的默认行为不能仅仅取我放入其中的任何设计大小。但它变得更糟。

我的逻辑下一步是将任务窗格的宽度显式设置为UserControl的宽度。由于Windows窗体设计器显示其大小属性为" 700,1500"我愚蠢地认为我可以在运行时读取该属性并将其分配给任务窗格的宽度。代码如下所示:

var myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(myUserControl, title);
myTaskPane.Visible = true;
myTaskPane.Width = myUserControl.Width;

这失败了,因为事实证明,在运行时," myUserControl.Width"是零。我得到的只是一个非常狭窄的任务窗格,只显示我的UserControl的左侧20%。我也尝试过分配" myUserControl.Size.Width",结果相同。

所以我将我的项目保存到了云端,并在第二天,在不同的PC上使用不同的显示器(4K)返回到它。令我惊讶的是,当我打开Windows窗体设计器时,UserControl的尺寸现在报告为" 432,1200"。但它看起来完全一样。

如果我为myTaskPane.Width分配一个立即值,那么 就可以了。如果该值恰好是Windows窗体设计器报告的宽度,则任务窗格正好是显示UserControl所需的宽度。除了硬编码设计参数我不行。此外,我会选择哪个价值? 700或432?当然,任务窗格在某些系统上看起来不对。

所以我有两个问题:UserControl尺寸如何正常工作?我在哪里可以在运行时读取UserControl的宽度?

最糟糕的是,这似乎是一个非常重要的东西,它必须有一个简单的解决方案,但我只能通过Google解决这个问题。

2 个答案:

答案 0 :(得分:0)

编辑:我认为我有一个解决方案,但事实证明它实际上是一种基于我实施的自定义方法的解决方法。这表明如果你坚持正确的命名约定并重用你的代码,最终你可能最终认为你自己的方法是.NET的一部分。继续阅读,我已经纠正了我的答案。

我有一个脑波......我的错误是认为通过Visual Studio中的Windows窗体编辑器可访问的控件属性也可以在运行时访问我的代码。我仍然不知道为什么不是这种情况,以及编辑器中显示的值会发生什么,但我猜测可能有一个方法疯狂(双关语)。

IntelliSense来了我的帮助,现在我的代码看起来像这样:

var myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(myUserControl, title);
myTaskPane.Visible = true;
myTaskPane.Width = myUserControl.GetActualWidth(); 

它有效。我的任务窗格现在是显示我放入其中的UserControl所需的确切宽度。

更正:那是因为我自己编码了“GetActualWidth()”一会儿。它的工作原理是读取UserControl中最大控件的宽度并为其添加边距。我忘记了我编码并因为不优雅而驳回了它。你将在UserControl中使用此GetActualWidth()方法,除非你也实现了它。

所以,仍然存在一些问题:为什么在同一个Visual Studio上打开但在两台不同计算机上打开的同一个项目会在Windows窗体编辑器中显示UserControl宽度的不同值?它与DPI缩放有关吗?有关于此的一些文件吗?为什么默认情况下任务窗格不能简单地显示其内容的100%?

现在还有一个问题:为什么我可以在UserControl中读取控件的宽度并获得其设计值,但我不能对UserControl本身做同样的事情? < / p>

答案 1 :(得分:0)

这是一个切向答案,但对于文档级加载项,必须以另一种方式设置宽度。

CommandBars["Task Pane"].Width = <your value here>;

我提取了from here