我应该使用哪种技术在我的加载项DLL中弹出一个简单的表单?

时间:2010-06-08 21:17:16

标签: wpf winforms add-in outlook-2007

我正在构建一个程序集,作为供应商的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窗体进行类似的操作?我应该关心吗?

2 个答案:

答案 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>