【问题标题】:Adding hover effect to listview item (windows universal 10)为列表视图项添加悬停效果(windows 通用 10)
【发布时间】:2016-03-02 13:08:48
【问题描述】:

我正在尝试向列表视图项添加悬停效果。 当数据在同一页面时,我可以添加悬停效果。

<Style TargetType="ListViewItem" x:Key="ListViewItemHover">
    <Setter Property="Template">
            <Setter.Value>
            <ControlTemplate TargetType="ListViewItem">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="PointerOver">
                                    <Storyboard>
                                        <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="Content1" />
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Pressed">
                                    <Storyboard>
                                        <ColorAnimation Duration="0" To="Blue" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="Content1" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Grid>
                            <ContentPresenter x:Name="Content1"/>
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

 <ListView Height="200">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListViewItem Width="100" Margin="10,0,0,0" Style="{StaticResource ListViewItemHover}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="120"/>
                    <RowDefinition Height="40"/>
                    <RowDefinition Height="40"/>
                </Grid.RowDefinitions>
                <Image Source="" Grid.Row="0"/>
                <TextBlock Text="1" Grid.Row="1"/>
                <TextBlock Text="1" Grid.Row="2" TextWrapping="Wrap"/>
            </Grid>
        </ListViewItem>
        <ListViewItem Width="100" Margin="10,0,0,0" Style="{StaticResource ListViewItemHover}">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="120"/>
                    <RowDefinition Height="40"/>
                    <RowDefinition Height="40"/>
                </Grid.RowDefinitions>
                <Image Source="" Grid.Row="0"/>
                <TextBlock Text="2" Grid.Row="1" />
                <TextBlock Text="2" Grid.Row="2"  TextWrapping="Wrap"/>
            </Grid>
        </ListViewItem>
    </ListView>

但是当使用资源字典时它会失败。

<ListView Height="200" Grid.Row="1" Name="test" ItemTemplate="{StaticResource row_items}">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
</ListView>

<DataTemplate x:Key="row_items">
    <ListViewItem Style="{StaticResource ListViewItemHover}">
        <Grid Width="100" Margin="10,0,0,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="120"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
            </Grid.RowDefinitions>
            <Image Source="{Binding data, Mode=TwoWay}" Grid.Row="0"/>
            <TextBlock Text="{Binding data1, Mode=TwoWay}" Grid.Row="1"/>
            <TextBlock Text="{Binding data2, Mode=TwoWay}" Grid.Row="2" TextWrapping="Wrap"/>
        </Grid>
    </ListViewItem>
</DataTemplate>

我假设数据模板导致了问题。但是我该如何解决。 有没有关于这个问题的好教程。我发现很多 wpf 但不是通用的。

提前致谢。

【问题讨论】:

    标签: xaml win-universal-app


    【解决方案1】:

    是的,你是对的。您的DataTemplate 是您的问题的原因。

    ListView.ItemTemplate 设置用于显示每个项目的DataTemplateDataTemplate 用在ListViewItem 里面,正好是ContentPresenter 的内容,你可以在Visual Studio 的Live Visual Tree中找到这个:

    所以要修复它,我们需要更改 DataTemplate 之类的:

    <DataTemplate x:Key="row_items">
        <Grid Width="100" Margin="10,0,0,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="120"/>
                <RowDefinition Height="40"/>
                <RowDefinition Height="40"/>
            </Grid.RowDefinitions>
            <Image Source="{Binding data, Mode=TwoWay}" Grid.Row="0"/>
            <TextBlock Text="{Binding data1, Mode=TwoWay}" Grid.Row="1"/>
            <TextBlock Text="{Binding data2, Mode=TwoWay}" Grid.Row="2" TextWrapping="Wrap"/>
        </Grid>
    </DataTemplate>
    

    要使用ListViewItemHover 样式,我们需要设置ItemContainerStyle 属性。此属性获取或设置在呈现项目容器时使用的样式。设置该属性相当于为ListViewItem设置Style

    <ListView Name="test"
              Grid.Row="1"
              Height="200"
              ItemContainerStyle="{StaticResource ListViewItemHover}"
              ItemTemplate="{StaticResource row_items}"
              ItemsSource="{Binding list}">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
    </ListView>
    

    【讨论】:

    • 有没有办法定位一个名为“test”的控件?例如我想在这个列表视图中定位一个名为“test”的文本块。
    • @user3884957:有几种方法可以访问 DataTemplate 中的命名控件,这取决于您的方案。你可以在互联网上搜索它。如果您对此仍有疑问,建议您专门针对您的新问题提出一个新问题。
    • 感谢您的回复 这位于我的 DataTemplate 中
    • @user3884957:我认为这个问题与原始问题无关。因此,请提出一个新问题来澄清您的情况和具体问题。谢谢。
    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2014-10-31
    相关资源
    最近更新 更多