Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 我应该使用哪种技术在外接程序DLL中弹出一个简单表单?_Wpf_Winforms_Add In_Outlook 2007 - Fatal编程技术网

Wpf 我应该使用哪种技术在外接程序DLL中弹出一个简单表单?

Wpf 我应该使用哪种技术在外接程序DLL中弹出一个简单表单?,wpf,winforms,add-in,outlook-2007,Wpf,Winforms,Add In,Outlook 2007,我正在构建一个程序集,该程序集作为供应商Outlook加载项的“加载项”运行。当我需要执行我的“操作”时,我必须设置一个带有几个简单控件的简单窗口。供应商的外接程序为我提供父窗口的整数句柄。通过从我的程序集中添加对System.Windows.Forms的are引用,并使用以下代码,我可以非常轻松地使用WinForms创建表单: FrmHistoryDisplay frm = new FrmHistoryDisplay(); frm.ShowDialog(new

我正在构建一个程序集,该程序集作为供应商Outlook加载项的“加载项”运行。当我需要执行我的“操作”时,我必须设置一个带有几个简单控件的简单窗口。供应商的外接程序为我提供父窗口的整数句柄。通过从我的程序集中添加对System.Windows.Forms的are引用,并使用以下代码,我可以非常轻松地使用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); }
        }
    }
表单的ShowDialog方法使用IWin32Window实现程序包装父窗口句柄


这一切都很有效,而且似乎很简单。我只是想知道是否可以用WPF窗口而不是WinForm表单来做类似的事情?我应该关心吗?

我将使用一种方法,该方法的注释如下:

“把一个从相当容易的 WinForms“


因为这是受支持的,所以您的外接程序将以这种方式具有更多内置功能。

我将使用一种方法,该方法的注释如下:

“把一个从相当容易的 WinForms“


因为这是受支持的,所以您的外接程序将以这种方式具有更多的内置功能。

是的,您可以使用WPF执行类似的操作,以托管由任意Win32窗口句柄拥有或作为父窗口的WPF窗口。给定WPF表单方法上下文中的wHandle,可以执行以下操作:

var helper = new WindowInteropHelper(this);
helper.Owner = wHandle;

this.Show();
这将把WPF窗口设置为给定wHandle拥有的标准顶级窗口。Win32窗口句柄所有权对于模式对话框行为、窗口激活和单击已停用应用程序的任何窗口时的焦点等至关重要


您是否应该在Outlook加载项中使用WinForms或WPF实际上取决于您和您的首选项。我很确定Outlook的UI既不使用WinForms也不使用WPF,因此无论您做什么,都需要确保在安装外接程序时在计算机上安装了正确的库。

是的,您可以使用WPF来托管由任意Win32窗口句柄拥有或作为父窗口的WPF窗口。给定WPF表单方法上下文中的wHandle,可以执行以下操作:

var helper = new WindowInteropHelper(this);
helper.Owner = wHandle;

this.Show();
这将把WPF窗口设置为给定wHandle拥有的标准顶级窗口。Win32窗口句柄所有权对于模式对话框行为、窗口激活和单击已停用应用程序的任何窗口时的焦点等至关重要


您是否应该在Outlook加载项中使用WinForms或WPF实际上取决于您和您的首选项。我很确定Outlook的UI既不使用WinForms也不使用WPF,因此无论您做什么,都需要确保在安装外接程序时在计算机上安装了正确的库。

@Chris:不过,对于UI的某些部分,可能有很好的理由使用WPF。在许多情况下,它的威力要大得多。在不了解所讨论的应用程序的情况下,很难知道这是否是一个好主意。@Reed:我认为你下面的回答与你在这里的评论相矛盾。@Chris:不-正如我在回答中所说的,我可能会使用WPF,但只用于UI的一部分,而不是所有部分。在没有更多信息的情况下,我不建议只使用WinForms。@克里斯:不过,在UI的某些部分使用WPF可能有很好的理由。在许多情况下,它的威力要大得多。在不了解所讨论的应用程序的情况下,很难知道这是否是一个好主意。@Reed:我认为你下面的回答与你在这里的评论相矛盾。@Chris:不-正如我在回答中所说的,我可能会使用WPF,但只用于UI的一部分,而不是所有部分。如果没有更多信息,我不建议只使用WinForms。