4

我使用以下代码在 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();

添加对WindowsBase和Outlook 项目的System.Xaml引用。PresentationFramework

在 .xml 中使用以下内容将功能区 (XML) 添加到 Outlook 项目。

<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

4

2 回答 2

1

也许您遇到了臭名昭著的“空域”问题。看这里这里这里。人们寄予厚望,希望它会在 .NET 4.5 中得到修复,但遗憾的是,当 MS 宣布修复本身存在太多错误而无法发布时,这些都破灭了。

于 2013-01-31T14:08:04.957 回答
0

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

WPF 对话框在 Windows 8 或 Windows Server 2012 中显示工具提示或下拉组合框时消失

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

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
  <add key="UseSetWindowPosForTopmostWindows" value="True" />
  </appSettings>
</configuration>
于 2017-11-07T07:57:31.917 回答