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();

WindowsBaseSystem.XamlおよびPresentationFrameworkOutlook プロジェクトへの参照を追加します。

.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

4

2 に答える 2

1

悪名高い「空域」の問題に遭遇している可能性があります。ここここここを参照してください。.NET 4.5 で修正されることが期待されていましたが、残念ながら、MS が修正自体がバグが多すぎてリリースできないと発表したため、これらは打ち砕かれました。

于 2013-01-31T14:08:04.957 に答える
0

ここで説明されているのと同じ問題である可能性があります。

Windows 8 または Windows Server 2012 でツールヒントまたはドロップダウン コンボ ボックスを表示すると、WPF ダイアログ ボックスが消える

.NET Framework 4.7.1 のソース コードには、System.Windows.FrameworkCompatibilityPreferencesクラスにコメントがあり、Windows デスクトップ ウィンドウ マネージャーにバグがあり、状況によってはウィンドウの z オーダーが正しくない可能性があると述べています。

推奨される回避策は、次のコードを 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 に答える