我正在构建一个程序集,作为供应商的Outlook加载项的“附加组件”运行。当我需要执行“动作”时,我必须建立一个带有一些简单控件的简单窗口。供应商的加载项为我提供了父窗口的整数句柄。通过添加对我的程序集中的System.Windows.Forms的引用并使用以下代码,我可以很容易地使用WinForms建立一个表单:
FrmHistoryDisplay frm = new FrmHistoryDisplay();
frm.ShowDialog(new ParentWindowWrapper(_parentWindowHandle));
其中ParentWindowWrapper是我给出的窗口句柄的垫片类
private class ParentWindowWrapper : IWin32Window {
private int _parentWindowHandle;
public ParentWindowWrapper(int parentWindowHandle) {
_parentWindowHandle = parentWindowHandle;
}
public IntPtr Handle {
get { return new IntPtr(_parentWindowHandle); }
}
}
Form的ShowDialog方法使用IWin32Window实现器来包装父窗口句柄。
这一切都很有效,看起来很简单。我只是想知道是否可以使用WPF窗口而不是WinForm窗体进行类似的操作?我应该关心吗?
答案 0 :(得分:2)
是的,您可以使用WPF执行类似的操作,将WPF窗口作为拥有或由任意Win32窗口句柄设置的父级。在WPF表单方法的上下文中给出wHandle,您可以这样做:
var helper = new WindowInteropHelper(this);
helper.Owner = wHandle;
this.Show();
这会将WPF窗口设置为由给定wHandle拥有的标准顶级窗口。在单击已停用的应用程序的任何窗口等时,Win32窗口句柄所有权对于模态对话框行为,窗口激活和焦点至关重要。
您是否应该为您的Outlook加载项使用WinForms或WPF取决于您和您的偏好。我非常确定Outlook的UI既不使用WinForms也不使用WPF,因此无论您做什么,都需要确保在安装加载项时在计算机上安装了正确的库。
答案 1 :(得分:1)
我将使用评论的方法:
“从一个非常简单的地方来 的WinForms“
由于支持此功能,因此将以这种方式为您的加载项提供更多内置功能。</ p>