我正在尝试将this WPF application转换为WPF UserControl,以便我可以通过ElementHost在WinForms应用程序中使用它。我是WPF的新手,在这次尝试之前从未接触过它,所以我可能会以错误的方式完成它。 我得到了UserControl项目进行编译,但是,我的StaticResources在VS中带有下划线,消息“资源'x'无法解析”。我已经尝试将xamls与所需的x:Key元素一起移动到一个级别(与UserControl Dijagram.xaml相同的级别),但它仍然无法解决它们。
在WinForms应用程序中,当尝试通过在ElementHost任务中选择托管内容来通过设计器添加UserControl时,我收到以下错误:“尝试创建'DijagramLC.Dijagram'类型的对象时发生错误。确定该类型具有默认构造函数。“(即使存在默认构造函数)。
但是,如果我在codebehind中添加它,就像这样:
wpfUserControl = new Dijagram();
elementHost1.Child = wpfUserControl;
Controls.Add(elementHost1);
代码编译但抛出此运行时错误:“ System.Windows.Markup.XamlParseException:'在'System.Windows.StaticResourceExtension'上提供值引发异常。”行号“20”和行位置“4”.---> System.Exception:找不到名为“MyToolbar”的资源。资源名称区分大小写。“
我尝试使用和不使用App.xaml并为有问题的xamls添加ResourceDictionary元素,但基本上,我不知道我在做什么:)
我已将代码上传到我的SkyDrive,如果有人可以看一看并告诉我我做错了什么,我会非常感激: https://skydrive.live.com/redir.aspx?cid=21be1f8e850e85cc&resid=21BE1F8E850E85CC!353
我讨厌盲目地跳到这样的新技术,但这次我别无选择,需要知道我的要求是否可以通过这种方式实现。
答案 0 :(得分:2)
问题是,你需要像这样的默认构造函数:
public CreatedPollsUC()
{
InitializeComponent();
}
如果构造函数中有任何其他代码,则会发生错误:
public CreatedPollsUC()
{
InitializeComponent();
// ... more code
}
因此,如果要在构造函数中使用更多代码,则需要首先将控件应用于元素主机。然后你可以编辑构造函数。
答案 1 :(得分: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);
}