1

我正在尝试将此 WPF 应用程序转换为 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

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

4

2 回答 2

2

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

public CreatedPollsUC()
{
    InitializeComponent();
}

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

public CreatedPollsUC()
{
    InitializeComponent();
    // ... more code
}

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

于 2013-03-20T13:26:11.920 回答
2

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

// 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);
}
于 2012-01-16T08:48:11.337 回答