wpf - View 不能被多个 Listview 共享

标签 wpf listview styles share

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

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

  • 用动态资源改变静态资源
  • 在 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>

我能做什么?

最佳答案

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

根据MSDN page on x:Shared

In WPF, x:Shared is only valid under the following conditions:

  • The ResourceDictionary that contains the items with x:Shared must be compiled. The ResourceDictionary cannot be within loose XAML or used for themes.

  • The ResourceDictionary that contains the items must not be nested within another ResourceDictionary. For example, you cannot use x:Shared for items in a ResourceDictionary that is within a Style that is already a ResourceDictionary item.

我不太确定编译的 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>

关于wpf - View 不能被多个 Listview 共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023694/

相关文章:

wpf - 一键使用两个 MultiDataTrigger

c# - MSDN 指的是 'app' 是什么?使用 .NET native 编译 Winforms 和 WPF

.net - WPF触发器更改父属性

.net - 高效绘制实时波形

Android忽略滚动条大小

Android ListView 项目背景颜色

android - ListView异步图片加载策略

python - 为什么 css 样式不适用于 GtkButton?

xaml - 具有按钮样式 XAML 的单选按钮

css - 关于基本 CSS 类和层次结构 - 不影响所有页面元素