【问题标题】:WPF Interop & DialogsWPF 互操作和对话框
【发布时间】:2009-06-16 18:52:20
【问题描述】:

我有一个现有的 WinForms 应用程序,我现在正在 WPF 中为其设计新的位。事情进展得相当顺利,我第一次遇到了对话的需求。

我想在 WPF 中执行对话框。看起来好像我需要为实际内容做一个 UserControl,然后通过带有 ElementHost 的 WinForms 表单托管该内容(因为 UserControl 没有 ShowDialog() 方法)。

这就是我的问题所在。这是如何运作的?我能说的最好的,WPF UserControl 甚至没有 DialogResult 属性(考虑到它没有 ShowDialog() 方法,这是有道理的)——在我看来,我需要一个 WPF Window 控件——而我不需要我想我可以在这种情况下使用它。

在这里的基本流程和设置上苦苦挣扎。有人能发光吗?

这可能吗?

【问题讨论】:

    标签: wpf interop dialog


    【解决方案1】:

    您可以从 WinForms 应用程序打开 WPF 窗口。

    只需创建窗口并调用ShowDialog()。 CLR 将加载 WPF 框架并打开窗口。

    【讨论】:

    • 看起来好像这需要一个单独的项目,但是,要创建新的 WPF 窗口,因为该选项根本不会出现在默认的 VS WinForms 项目模板中。但是,一旦您这样做,它确实有效。另一件值得注意的事情是,WPF 窗口中的 ShowDialog() 方法返回 ?bool 而不是我们习惯的更细粒度的 DialogResult(这当然是有道理的——因为它对该类一无所知) .谢谢,卡梅伦。
    【解决方案2】:

    如果您希望您的互操作应用程序主要像 WinForms 应用程序一样工作,那么您描述的方法可以正常工作——在我的互操作案例中,我的做法几乎相同。

    WPF 支持 MessageBoxes(尽管版本与 WinForms 略有不同),您可以使用 WPF Windows 将一些东西放在一起(通过添加类似于 DialogResult 的东西来扩展它)。但是,提供的 WPF 控件表明他们正在尝试更改 UX 交互以最小化对话框,尤其是模式对话框。

    为了让您的生活更轻松,我将创建一个 WinForms Form/ElementHost 子类,专门用于处理 w/托管 WPF 内容,并根据您喜欢“使用”声明的干净程度,包装您自己的类似 DialogResult 的枚举,以便您不必包含 System.Windows.Forms 命名空间,这会使您的 WPF 代码隐藏更加麻烦。

    【讨论】:

    • 但是我描述的方法有一个很大的缺失——DialogResult。那是从哪里来的?我能以某种方式使用 WPF 窗口控件吗?如果有,怎么做?
    • DialogResult 是一个简单的枚举——创建一个类似的枚举(或重用 System.Windows.MessageBoxResult)和子类 Window 并不难。但是,由于您的应用程序的核心是 WinForms,我会坚持使用嵌入式 ElementHost 创建一个特定的 Form 派生类,您可以使用它来包装 WPF 内容。
    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多