【问题标题】:create multiple copies of staticresource创建静态资源的多个副本
【发布时间】:2016-02-19 17:08:11
【问题描述】:

我有一个项目控制模板,如下所示。对于模板中的每个项目,我需要单独的 colorProvider 实例。项目控件中的每个项目都需要一个单独的颜色提供程序实例,具体取决于它所绑定的项目。 如何创建静态资源的多个副本,以便静态资源仅可用于该项目。

<ItemsControl x:Name="itemsControl" ItemsSource="{Binding DataList}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Vertical"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid MinHeight="250">
                        <ContentPresenter Content="{Binding }" ContentTemplateSelector="{StaticResource chartSelector}">
                            <ContentPresenter.Resources>
                                <v:ColorProvider x:Key="colorProvider"/>
                            </ContentPresenter.Resources>
                        </ContentPresenter>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

【问题讨论】:

  • colorProvider 资源永远不会在您的代码中使用。请描述您打算如何使用此资源。
  • 它是从将在 contentpresenter 中加载的模板中引用的。然而,作为一种解决方法,我设法使用控制标记对象来获取对应该初始化颜色提供程序的数据的引用。
  • 听起来像x:Shared="False" case。

标签: c# wpf xaml staticresource


【解决方案1】:

要在每次请求静态资源时返回一个新实例,您可以使用x:Shared 属性。这记录在MSDN 上。根据我对这个属性的经验,在尝试设置它时,您将不会获得 Intellisense 支持。在您的情况下,需要在资源部分的 ColorProvider 上设置属性,如下所示。

<ContentPresenter Content="{Binding }" ContentTemplateSelector="{StaticResource chartSelector}">
  <ContentPresenter.Resources>
    <v:ColorProvider x:Key="colorProvider" x:Shared=false />
  </ContentPresenter.Resources>
</ContentPresenter>

【讨论】:

  • 太棒了!它有效,而且你对智能感知也是正确的!
  • 如果您尝试添加两次非共享资源,这是避免“指定的视觉对象已经是另一个视觉对象的子对象或 CompositionTarget 的根”错误的一种方法。
【解决方案2】:

如果资源值因数据而异,则应将 Binding 与将返回颜色的值转换器结合使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多