【问题标题】:Turn off ListView border mouseover animations关闭 ListView 边框鼠标悬停动画
【发布时间】:2012-04-19 15:07:37
【问题描述】:

ListView 的默认样式会在您将鼠标悬停在控件上时将边框颜色设置为浅蓝色。有没有办法在不替换整个控件模板的情况下关闭它?

我试过了

<ListView>
    <ListView.Style>
        <Style TargetType="ListView">
            <Setter Property="BorderBrush" Value="Green"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">       
                    <Setter Property="BorderBrush" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.Style>
</ListView>

这会导致绿色边框,当您将鼠标悬停时会短暂变为红色,然后逐渐变为浅蓝色。默认动画优先。

我是否遗漏了一些简单的东西,或者是时候重写模板了?

【问题讨论】:

    标签: c# wpf listview styles controltemplate


    【解决方案1】:

    您必须覆盖ControlTemplate,因为默认使用ListBoxChrome 元素来创建您看到的效果。 ListBoxChrome 会在鼠标悬停时忽略 BorderBrush 属性,由其 RenderMouseOver 属性决定。

    如果需要,您仍然可以使用ListBoxChrome,您只需删除RenderMouseOver 属性。假设您使用的是 GridView,您将使用:

    xmlns:theme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
    
    ...
    
    <Style x:Key="{x:Static GridView.GridViewStyleKey}"
           TargetType="{x:Type ListView}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListView}">
                    <theme:ListBoxChrome Name="Bd"
                                         BorderThickness="{TemplateBinding BorderThickness}"
                                         BorderBrush="{TemplateBinding BorderBrush}"
                                         Background="{TemplateBinding Background}"
                                         RenderFocused="{TemplateBinding IsKeyboardFocusWithin}"
                                         SnapsToDevicePixels="true">
                        <ScrollViewer Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}"
                                      Padding="{TemplateBinding Padding}">
                            <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </ScrollViewer>
                    </theme:ListBoxChrome>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsGrouping"
                                 Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll"
                                    Value="false"/>
                        </Trigger>
                        <Trigger Property="IsEnabled"
                                 Value="false">
                            <Setter TargetName="Bd"
                                    Property="Background"
                                    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    如果您想移除集中的外观,那么最好将ListBoxChrome 替换为Border 元素。

    【讨论】:

    • 太棒了,谢谢!即使使用 Snoop,我也无法确定动画的来源。还不太熟悉 chrome 的工作原理,所以您的回答非常有用。
    猜你喜欢
    • 2012-09-18
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多