【问题标题】:Why is the Style defined inside of the control being ignored?为什么控件内部定义的样式被忽略?
【发布时间】:2015-08-27 12:16:30
【问题描述】:

我在UserControl 中有一个ListBox,其样式在ListBox.Resources 中定义,但该样式被忽略。我们在Application.Resources 中添加了一个通用的ListBox 样式。

为什么Application.Resources 样式优先于控件资源中定义的样式?

这就是我定义ListBox 及其样式的方式:

<ListBox x:Name="myListBox" SelectionMode="Extended" >            
    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>                                        
                                </Grid.ColumnDefinitions>
                                <Border Margin="0" Padding="2" Grid.Column="0" Grid.ColumnSpan="2" x:Name="Background" CornerRadius="0" Background="Transparent" BorderThickness="0" BorderBrush="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                                <CheckBox x:Name="myCheckBox" Grid.Column="0" IsChecked="{Binding MyBoolean}" 
                                      HorizontalAlignment="Center" IsThreeState="False" VerticalAlignment="Center" Background="Transparent" Click="myCheckBox_Click"/>
                                <TextBlock Grid.Column="1" Text="{Binding ItemName}" VerticalAlignment="Center" Margin="4,1,2,4">
                                    <TextBlock.Style>
                                        <Style TargetType="TextBlock">
                                            <Setter Property="Foreground" Value="Black" />                                                
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>
</ListBox>

这就是我们在App.xaml - Application.Resources 中添加ListBox 通用样式的方式:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>                         
            <ResourceDictionary Source="pack://application:,,,/MyAssembly;component/MyListBoxGenericStyle.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

另外,如果我在 ListBox.ItemContainerStyle 中定义样式,它似乎可以工作:

<ListBox x:Name="myListBox" SelectionMode="Extended" >            
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>                                        
                                </Grid.ColumnDefinitions>
                                <Border Margin="0" Padding="2" Grid.Column="0" Grid.ColumnSpan="2" x:Name="Background" CornerRadius="0" Background="Transparent" BorderThickness="0" BorderBrush="Transparent" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
                                <CheckBox x:Name="myCheckBox" Grid.Column="0" IsChecked="{Binding MyBoolean}" 
                                      HorizontalAlignment="Center" IsThreeState="False" VerticalAlignment="Center" Background="Transparent" Click="myCheckBox_Click"/>
                                <TextBlock Grid.Column="1" Text="{Binding ItemName}" VerticalAlignment="Center" Margin="4,1,2,4">
                                    <TextBlock.Style>
                                        <Style TargetType="TextBlock">
                                            <Setter Property="Foreground" Value="Black" />                                                
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>
</ListBox>

【问题讨论】:

  • 你能分享 MyListBoxGenericStyle 中的 ListBox 样式吗?
  • @VMaleev - 当然,我刚刚添加了它。现在比较简单。

标签: wpf wpf-4.0


【解决方案1】:

您应该改为定义字典下列表框资源下列出的样式。将样式或模板放在要操作的元素下类似于忽略 CSS 并直接在 HTML 中的元素中做样式。

你可以给字典资源模板一个名字,并在标签中引用它为

<ListBox ItemTemplate="{StaticResource MyTemplate}">

【讨论】:

    【解决方案2】:

    检查MyListBoxGenericStyle.xaml 的样式是否没有将ItemContainerStyle 明确设置为另一个值。这将使您的默认样式无用。

    此外,您可以通过 Snoop 检查您的 ListBoxItem 从哪里获取样式(即本地设置、资源、主题等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2019-03-22
      相关资源
      最近更新 更多