1

我需要阴影ListBoxItemMouseOver底部代码有效,但包括字母在内的整个列表框TextBlock都有阴影:

<ListBox  ItemContainerStyle="{StaticResource Style1}"

和项目Style

<Style x:Key="Style1" TargetType="{x:Type ListBoxItem}">             
    <Style.Triggers>                    
        <Trigger Property="IsMouseOver" Value="True" >
            <Setter Property = "Effect"  >
                <Setter.Value>
                    <DropShadowEffect ShadowDepth="10" Direction="0" Opacity="1" BlurRadius="5" Color="Black"/>
                </Setter.Value>
            </Setter>
        </Trigger>

简化DataTemplate

<DataTemplate x:Key="TemplateSimple" >
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <TextBlock Text="{Binding Title}" Grid.Column="0"/>
        <TextBlock Text="{Binding FirstName}" Grid.Column="1"/>
        <TextBlock Text="{Binding LastName}" Grid.Column="2"/>

示例被简化。

我还尝试添加到DataTemplate

<Rectangle Grid.Column="0" Fill="GreenYellow" Grid.ColumnSpan="3"> 

并将阴影分配给它,但只有当TextBlocks 为空时它才会做出反应。其他想法表示赞赏。

编辑: 如您所见,它不是真正的阴影,而是模糊的文字。如果它是一个阴影,它会在改变阴影长度时发生很大变化:

在此处输入图像描述

4

1 回答 1

1

请参阅这篇文章,如何将效果应用于边框但不应用于 WPF 中的内容?,其中有一些关于此“功能”的文档。

在您的情况下,最简单的解决方法可能是为 GridDataTemplate提供背景颜色:

<DataTemplate x:Key="TemplateSimple" >
    <Grid Background="White" > ...

编辑:

更彻底的方法是将 应用于DropShadowEffect位于文本下方但不包含文本的元素。例如,将一个矩形添加到您的DataTemplate:

<DataTemplate x:Key="TemplateSimple" >
    <Grid Margin="2" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Rectangle Style="{StaticResource RectStyle1}" 
                   Fill="Lime" Grid.ColumnSpan="3" />

        <TextBlock Text="{Binding Title}" Grid.Column="0" />
        <TextBlock Text="{Binding FirstName}" Grid.Column="1" />
        <TextBlock Text="{Binding LastName}" Grid.Column="2" />
    </Grid>
</DataTemplate>

..而不是将 DropShadowEffect 放入Style1,将其放入RectStyle1,但仍由父级上的 IsMouseOver 触发ListBoxItem

<Style x:Key="RectStyle1" TargetType="Rectangle" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem},
                                       Path=IsMouseOver, 
                                       Mode=OneWay}" 
                     Value="True" >
            <Setter Property="Effect" >
                <Setter.Value>
                    <DropShadowEffect ShadowDepth="10" Direction="0" 
                                      Opacity="1" BlurRadius="5" 
                                      Color="Black" />
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>
于 2013-05-30T20:40:34.400 回答