【问题标题】:View can't be shared by more than one Listview视图不能被多个 Listview 共享
【发布时间】:2015-12-01 15:15:30
【问题描述】:

我遇到了一个问题,很多人以前也遇到过。我尝试使用一种样式,其中包含由多个控件组成的 GridView。

我在网上搜索了答案,得到了两个解决方案:

  • 用 DynamicResource 更改 StaticResource
  • 在 GridView 上使用 x:shared="False"

我尝试了这两种解决方案(甚至同时尝试),但当我将样式应用于第二个控件时,错误仍然出现。

样式是这样的

<Style x:Key="MyCustomStyle" TargetType="{x:Type MyUserControl}" BasedOn="{StaticResource MyUserControlBaseStyle}">
    <Setter Property="Watermark" Value="{x:Static LabelResources.Caption}"/>
    <Setter Property="ErrorText" Value="{Binding Converter={StaticResource FormatStringConverter}, ConverterParameter={x:Static LabelResources.Caption}}"/>
    <Setter Property="LookupTemplate">
        <Setter.Value>
            <DataTemplate DataType="{x:Type LookupResult}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" Margin="0,0,2,0"/>
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>

    <Setter Property="SuggestionsView" Value="{DynamicResource CustomGridView}"/>
</Style>

这里是 GridView

<GridView x:Key="CustomGridView" x:Shared="False">
    <GridViewColumn Header="{x:Static resources:LabelResources.Name}" Width="Auto" HeaderContainerStyle="{DynamicResource GridViewHeaderStyle}">
        <GridViewColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}" HorizontalAlignment="Left"/>
            </DataTemplate>
        </GridViewColumn.CellTemplate>
    </GridViewColumn>             
</GridView>

我能做什么?

【问题讨论】:

    标签: wpf listview styles share


    【解决方案1】:

    听起来您只创建了一个 CustomGridView 实例,并且您试图将其分配到多个位置,这导致了异常。

    根据MSDN page on x:Shared

    在 WPF 中,x:Shared 仅在以下条件下有效:

    • 必须编译包含 x:Shared 项的 ResourceDictionary。 ResourceDictionary 不能在松散的 XAML 中或使用 主题。

    • 包含项目的 ResourceDictionary 不得嵌套在另一个 ResourceDictionary 中。例如,您不能使用 x:Shared 用于样式中的 ResourceDictionary 中的项目 已经是 ResourceDictionary 项。

    我不太确定编译资源字典意味着什么,但您可以尝试将构建操作更改为页面而不是资源,例如 this answer suggests

    如果您无法让 x:Shared 正常工作,那么也许可以考虑将 SuggestionsView 改为 ContentTemplateDataTemplate,这样每次使用都会创建自己的 GridView。

    <ContentTemplate x:Key="CustomGridView">
        <GridView>
            <GridViewColumn Header="{x:Static resources:LabelResources.Name}" Width="Auto" HeaderContainerStyle="{DynamicResource GridViewHeaderStyle}">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Name}" HorizontalAlignment="Left"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>             
        </GridView>
    </ContentTemplate>
    

    【讨论】:

    • 嗨,瑞秋。 x:shared="false" 的目的不是创建 GridView 的新实例吗? SuggestionsView 基本上是一个从 GridView 派生的类,具有一些额外的功能,允许我添加动态创建的列。
    • @StefanG 是的,但它仅在对象位于已编译的 ResourceDictionary 中时才有效。如果它是松散的 XAML 或在另一个嵌套字典中,它将不起作用。你的设置如何?
    • 我有一个 ResourceDictionary ,其中包含我用于此控件的所有样式。 “编译”是什么意思?是否有一个特殊的选项或者是使用 ResourceDictionaries 时的正常行为?
    • @StefanG 我认为它需要编译为一个单独的文件。我只是在阅读MSDN site for x:Shared 的底部: x:Shared 仅在以下条件下有效:a) 必须编译包含带有 x:Shared 的项目的 ResourceDictionary。 ResourceDictionary 不能在松散的 XAML 中或用于主题。 b) 包含项目的 ResourceDictionary 不得嵌套在另一个 ResourceDictionary 中。
    • @StefanG 也许验证 ResourceDictionary 的 Build Action 设置为 Page 而不是 Resource,如本答案所述? stackoverflow.com/a/22070256/302677
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多