我使用以下代码从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
,System.Xaml
和PresentationFramework
的引用添加到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
时会看到错误。
答案 0 :(得分:1)
答案 1 :(得分:0)
这可能与此处描述的问题相同:
.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>