通过 ElementHost 将 WPF 应用程序转换为 UserControl 以在 WinForms 应用程序中使用

Posted

技术标签:

【中文标题】通过 ElementHost 将 WPF 应用程序转换为 UserControl 以在 WinForms 应用程序中使用【英文标题】:Converting WPF application to UserControl for use in WinForms application via ElementHost 【发布时间】:2011-10-14 22:54:39 【问题描述】:

我正在尝试将this WPF application 转换为 WPF UserControl,以便我可以通过 ElementHost 在 WinForms 应用程序中使用它。我是 WPF 的新手,在此尝试之前从未接触过它,所以我可能会以完全错误的方式进行操作。

我得到了要编译的 UserControl 项目,但是,我的 StaticResources 在 VS 中得到下划线,并带有消息“资源 'x' 无法解析”。我已经尝试将带有所需 x:Key 元素的 xamls 向上移动一级(与 UserControl Dijagram.xaml 相同的级别),但它仍然无法解决它们。

在 WinForms 应用程序中,当尝试通过在 ElementHost 任务中选择托管内容来通过设计器添加 UserControl 时,我收到以下错误:

尝试创建类型对象时发生错误 'DijagramLC.Dijagram'。确保该类型具有默认构造函数。

(即使存在默认构造函数)。

但是,如果我在代码隐藏中添加它,像这样:

wpfUserControl = new Dijagram();
elementHost1.Child = wpfUserControl;
Controls.Add(elementHost1);

代码编译但抛出此运行时错误:“System.Windows.Markup.XamlParseException: 'Provide value on 'System.Windows.StaticResourceExtension' 抛出异常。'行号“20”和行位置“4”。---> System.Exception: 找不到名为“MyToolbar”的资源。资源名称区分大小写。"

我尝试过使用和不使用 App.xaml 并为有问题的 xaml 添加 ResourceDictionary 元素,但基本上,我不知道自己在做什么 :)

我已将代码上传到我的 SkyDrive,如果有人可以查看并告诉我我做错了什么,我将不胜感激: https://skydrive.live.com/redir.aspx?cid=21be1f8e850e85cc&resid=21BE1F8E850E85CC!353

我讨厌像这样盲目地跳入新技术,但这次我别无选择,我需要知道我的要求是否可以通过这种方式实现。

【问题讨论】:

【参考方案1】:

您可能会收到错误消息,因为您使用了未加载的资源字典中的资源。在托管应用程序中加载资源字典可能会解决问题:

// When hosting a WPF usercontrol inside an element host, 
// application resources are not loaded, so we need to load them manually.
var resources = new ResourceDictionary

    Source = new Uri("/UNIT4.MKB.GUI.XAML.Dashboard.Resources;component/resources.xaml", UriKind.Relative)
;


// Check for null reference
if (Application.Current != null)

    //Merge the loaded ResourceDictornairy with the dummy application Resources.
    Application.Current.Resources.MergedDictionaries.Add(resources);

【讨论】:

您在哪里输入此代码?您是否必须对合并字典中的每个资源都执行此操作?【参考方案2】:

问题是,你需要这样的默认构造函数:

public CreatedPollsUC()

    InitializeComponent();

如果构造函数中有任何其他代码,则会发生错误:

public CreatedPollsUC()

    InitializeComponent();
    // ... more code

因此,如果您想在构造函数中使用更多代码,则需要先将控件应用于元素宿主。然后就可以编辑构造函数了。

【讨论】:

您好,感谢您的回答。如何先应用控件? @KhawajaAsim 应用什么控制? '您需要先将控件应用到元素宿主。然后你可以编辑构造函数。这一行。 @KhawajaAsim 这意味着InitializeComponent 必须是构造函数的第一行。 @KhawajaAsim 你找到解决这个问题的方法了吗?

以上是关于通过 ElementHost 将 WPF 应用程序转换为 UserControl 以在 WinForms 应用程序中使用的主要内容,如果未能解决你的问题,请参考以下文章

将 WPF 控件与 WinForms 一起使用

在 WinForms 应用程序中使用 WPF,将应用程序资源放在哪里?

WinForms 互操作,从 WinForms 拖放 -> WPF

Winforms 中的 WPF 事件

如何将此 WPF 控件添加到我的 WinForm 中?

.Net:如何在 Windows 窗体应用程序中使用 WPF 用户控件?