WPF ContentControl内容未获取父资源

时间:2012-04-19 13:15:36

标签: c# .net wpf visual-studio-2010

我目前正在掌握WPF资源并想知道你是否可以帮助我:

我有一个WPF窗口,其中包含自己的资源。它还包含一个内容控件,它根据树视图中选择的内容更改其内容,例如:

contentControl1.Content = someUserControl;

这可以是UserControl,例如SomeUserControl使用我在窗口xaml中定义的静态资源。

在后面的窗口代码中创建SomeUserControl的实例时,我得到一个XMLParseException('System.Windows.StaticResourceExtension'上的'提供值引发异常。')。这是包含对静态资源的绑定的行。

为了解决这个问题,我将其添加到SomeUserControl的构造函数中(parentResources是实例化someUserControl的窗口资源):

public SomeUserControl(ResourceDictionary parentResources)
{
    this.Resources.MergedDictionaries.Add(parentResources);
    InitializeComponent();
}

这是在这种特殊情况下寻找资源的最佳方法吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我假设你有{StaticResource myResource}。您是否尝试过使用{DynamicResource myResource}

请参阅http://msdn.microsoft.com/en-us/library/ms748942.aspx

修改

好的,鉴于你的资源是一个转换器,它不能使用动态资源,那么我认为你所做的可能是一个很好的解决方案。

潜在的问题是,在您的控件被实例化的那一刻,它不是Window的一部分,因此它无法访问Window的资源。正如StaticResource中的术语static所暗示的那样,控件期望资源可用。因此,在实例化控件时必须使其可用。

您可能还希望查看类似Prism的内容以及区域内容,这可能是更好地处理交换“控件”的方式(取决于您的需求)。

答案 1 :(得分:1)

实际上,这取决于你所谈论的资源。

因为你做这件事的方式可能非常好,只有缺点,你可以脱离声明性编程,这是期望在WPF中编码的方式。

您还可以在App.xaml中添加StaticResource,这样一旦您的应用启动,它就会被初始化,并以任何方式窗口加载之前。

希望这有帮助。