2012-04-19 82 views
0

目前我得到与WPF资源交手,不知道如果你能帮助我:WPF ContentControl中的内容没有得到家长资源

我有一个包含自己的资源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(); 
} 

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

回答

1

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

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

编辑

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

根本的问题是,在你的控制实例化的那一刻,它不是窗口的一部分,因此它不具有窗口资源的任何访问。正如StaticResource中的静态术语所暗示的,控制要求资源可用。所以你必须在控件实例化时使它可用。

你可能也想看看类似Prism的东西,它是Region的,这可能是更好的方式来处理你的“控制”(取决于你的需要)。

+0

您好,感谢您的建议:不,这不利于,而不是我得到:A“DynamicResourceExtension”不能在'转换器“结合”类型的属性设置。 'DynamicResourceExtension'只能在DependencyObject的DependencyProperty上设置。 - 我目前正在绑定转换器我写过 – Jeb 2012-04-19 13:25:53

1

这取决于你在说些什么资源,其实。

因为你这样做的方式可能很好,只有缺点,你从声明性编程,这是预期分离自己的WPF编码方式。

您还可以添加一个StaticResource,例如在App.xaml中,所以它会被初始化一旦加载你的应用程序启动,并在任何方式,窗口负荷。

希望这会有所帮助。

+0

感谢您的帮助。我对我写的转换器有约束力。不幸的是,我无法添加到App.xaml;我以winforms托管WPF表单。有解决方法(http://stackoverflow.com/questions/3799515/adding-a-static-resourcedictionary-to-usercontrols-before-the-xaml-is-parsed),但我使用顶级窗口的资源作为应用程序.xaml等效,并且不显示任何可能共享资源的其他wpf表单。 – Jeb 2012-04-19 13:30:48

+0

考虑到,类型的极端条件(在WinForms中托管)在你现在正在做的事情中没有看到任何问题,所以。 – Tigran 2012-04-19 13:34:00