如何以编程方式启用“MS Word打印设置”对话框中的“选项...”按钮

时间:2009-12-08 07:38:52

标签: c# .net ms-word ms-office vsto

我正在尝试在VSTO AddIn for Microsoft Word 2003中显示MS Word“打印设置”对话框。我可以显示对话框,但对话框左下角的选项按钮始终按照以下截图。

alt text

到目前为止,我所做的相关代码是:

private void printSetup_Click(CommandBarButton Ctrl, ref bool CancelDefault)
{
    Dialog dialog = App.Dialogs[WdWordDialog.wdDialogFilePrintSetup];
    Object missing = Type.Missing;
    dialog.Show(ref missing); // Note that the param is TimeOut
}

任何人都可以告诉我要启用“选项”按钮需要做什么吗?我知道可以这样做,因为我们正在替换在VBA中执行此操作的模板,并且在那里启用了按钮......

此致 本

2 个答案:

答案 0 :(得分:0)

对话框的属性仅通过后期绑定提供,因为您使用的是C#,所以您需要使用InvokeMember来获取和设置与您正在使用的对话框相关的值。

WdWordDialog Enumeration的文档中,您知道对于WdWordDialog.wdDialogFilePrintSetup对话框,Options属性可用。该链接适用于Office 2007,但对于手头的情况,它应该足够了。

有了这些知识,您可以执行以下操作来设置对话框属性值:

object objectDialog = (object)dialog;

object[] args = new object[1];
args[0] = (object) null; // Specify value for Options attribute just as in VBA

objectDialog.GetType().InvokeMember(
    "Options", 
    BindingFlags.SetProperty, 
    null, 
    objectDialog, 
    args);

答案 1 :(得分:0)

我现在有一个解决方案可以解决我从同事那里得到的问题。

虽然它没有解决从任何VSTO C#代码启动此对话框的更一般情况,但它可以通过单击工具栏按钮(我们正在尝试这样做)正确启动此对话框。所以这解决了我们的问题。

我现在的意见是,这是MS Word的一个错误(功能?),并且没有任何通用的方法从代码显示此对话框并启用“选项...”按钮。我认为它只能在MS Word自动调用对话框时才能工作,因为它作为内置控件连接到CommandBar。我在VBA和VSTO中都看到了相同的行为,它倾向于支持这是一个Word限制/错误的理论。

所以我们之前有这样的代码:

public MyCommandBar()
{
  _myBar = App.CommandBars.Add("My Toolbar", 1, Type.Missing, true);

  // Add a button to call our custom event handler
  _printSetup = (CommandBarButton)
          _myBar.Controls.Add(MsoControlType.msoControlButton, 
          Type.Missing, Type.Missing, 1, true); 
  _printSetup.Click += printSetup_Click(); // Call the handler shown in my original question
  // More stuff...
}

当修改为通过将第二个参数(Id)更改为Controls.Add()从Type.Missing到511(文件打印设置对话框的ID)来调用内置控件时,如此“选项.. 。“按钮启用就像人们期望的那样:

public MyCommandBar()
{
  _myBar = App.CommandBars.Add("My Toolbar", 1, Type.Missing, true);

  // Call the built-in File Print Setup dialog automagically
  _printSetup = (CommandBarButton)
          _myBar.Controls.Add(MsoControlType.msoControlButton, 
          511, Type.Missing, 1, true); 
  // More stuff...
}

希望这有助于遇到此问题的其他人。