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