在Outlook中显示WPF窗口时出现奇怪的行为

时间:2013-01-21 10:36:03

标签: wpf outlook window ms-office office-addins

我使用以下代码从Outlook中的新消息窗口显示我的WPF窗口:

private void DisplayWindow(Window window) {
    var wih = new System.Windows.Interop.WindowInteropHelper(window);
    wih.Owner = GetForegroundWindow();            
    window.ShowInTaskbar = false;            
    window.ShowDialog();
}

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

我的问题是,当ToolTips和ComboBox下拉变为可见时,WPF窗口会消失在新消息窗口后面,只留下前面的“弹出”内容。任何人都可以解释为什么会发生这种情况,以及托管窗口的正确方法是什么?

编辑:

只有将收件人添加到“发送”框后才会发生这种情况,而当前台窗口是新的邮件消息窗口时,似乎只会出现问题。

要复制:

将Outlook加载项项目和WPF项目(以.NET 4.0为目标)添加到新解决方案中。

在MainWindow.xaml上放置一个包含几个项目的ComboBox。

从App.xaml中删除StartupUri并将以下内容添加到App.cs。

public void ShowWindow() {
    MainWindow window = new MainWindow();
    var wih = new System.Windows.Interop.WindowInteropHelper(window);
    wih.Owner = GetForegroundWindow();
    window.ShowInTaskbar = false;
    window.ShowDialog();
}

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

将对WindowsBaseSystem.XamlPresentationFramework的引用添加到Outlook项目中。

将一个功能区(XML)添加到Outlook项目中,并在.xml中添加以下内容。

<customUI ...>
  <ribbon>
    <tabs>
      <tab idMso="TabNewMailMessage">
        <group id="MyGroup"
               insertAfterMso="GroupMailNew">
          <button id="myButton"
                  size="large"      
                  onAction="myButton_Action"
                  imageMso="HappyFace"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

将以下内容添加到功能区代码中。

MyWpfApplication.App app;

public void Ribbon_Load(Office.IRibbonUI ribbonUI) {
    this.ribbon = ribbonUI;

    var appThread = new Thread(new ThreadStart(() => {
        this.app = new MyWpfApplication.App();
        app.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
        app.Run();
    }));
    appThread.SetApartmentState(ApartmentState.STA);
    appThread.Start();
}

public void myButton_Action(Office.IRibbonControl control) {

    // Dispatcher used as cross thread operation.
    app.Dispatcher.BeginInvoke((Action)(() => {
        app.ShowWindow();
    }));
}

将以下内容添加到ThisAddIn

protected override Microsoft.Office.Core
        .IRibbonExtensibility CreateRibbonExtensibilityObject() {
    return new Ribbon();
}

运行Outlook加载项,创建新邮件,添加收件人,然后单击笑脸按钮。点击ComboBox时会看到错误。

2 个答案:

答案 0 :(得分:1)

也许你正在遇到臭名昭着的“空域”问题。请参阅hereherehere。人们寄予厚望,希望它能在.NET 4.5中得到修复,但遗憾的是,当MS宣布修复本身太错误而无法发布时,这些都破灭了。

答案 1 :(得分:0)

这可能与此处描述的问题相同:

The WPF dialog box disappears when it displays a tooltip or drop-down combo box in Windows 8 or Windows Server 2012

.NET Framework 4.7.1的源代码在System.Windows.FrameworkCompatibilityPreferences类中有注释,说Windows桌面窗口管理器中存在一个错误,在某些情况下会导致Windows的z-order错误。

建议的解决方法是将以下代码添加到WPF应用程序的app.config文件中:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
  <add key="UseSetWindowPosForTopmostWindows" value="True" />
  </appSettings>
</configuration>