【问题标题】:Changing a ListBoxItems mouse over style in Xaml/Wpf在 Xaml/Wpf 中更改 ListBoxItems 鼠标悬停样式
【发布时间】:2018-09-23 20:21:26
【问题描述】:

我正在尝试更改ListBox,以便当我将鼠标悬停在它上面时,它不再显示默认的IsMouseOver style

根据我的在线搜索,建议的代码看起来像这样;

<ListBox ItemsSource="{Binding ExampleItems}">

    ...

    <ListBox.ItemContainerStyle>
         <Style TargetType="{x:Type ListBoxItem}">
              <Setter Property="Background" Value="Red" />
              <Setter Property="BorderBrush" Value="Blue" />
              <Style.Triggers>
                   <Trigger Property="IsMouseOver" Value="True">
                       <Setter Property="Background" Value="Gold"/>
                       <Setter Property="BorderBrush" Value="Purple"/>
                   </Trigger>
              </Style.Triggers>
         </Style>
   </ListBox.ItemContainerStyle>
</ListBox>

此代码生成正确的初始着色结果,也就是说,项目以红色Background 和蓝色Border 显示;

Before MouseOver Trigger

IsMouseOver 触发器仍显示默认样式;

After MouseOver Trigger

我知道颜色很糟糕,这只是为了演示目的。关于我做错了什么有什么建议吗?

编辑: 正如已经回答的那样,我找到了ControlTemplate(通过Properties-Misc 面板),但是我现在不确定如何设置我在Xaml 中看不到的ListBoxItemControlTemplate。一旦程序通过ItemSource 绑定运行,就会创建ListBoxItems,有没有办法为数据绑定ListBoxItemsControlTemplate 设置ListBox

谢谢!

【问题讨论】:

    标签: wpf xaml styles


    【解决方案1】:

    问题出在 listboxitem 的模板中。
    要获得它的副本,请将 ListBoxItem 添加到任何窗口中。

    在 XAML 中选择它。
    在属性窗口中查看它的属性。 找到杂项部分。
    里面有模板。
    单击右侧的框并创建为资源。
    你得到的(在 win 10 中)是这样的:

        <ControlTemplate x:Key="ListBoxItemControlTemplate1" TargetType="{x:Type ListBoxItem}">
            <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
                <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Border>
            <ControlTemplate.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" TargetName="Bd" Value="#1F26A0DA"/>
                    <Setter Property="BorderBrush" TargetName="Bd" Value="#A826A0DA"/>
                </MultiTrigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="Selector.IsSelectionActive" Value="False"/>
                        <Condition Property="IsSelected" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" TargetName="Bd" Value="#3DDADADA"/>
                    <Setter Property="BorderBrush" TargetName="Bd" Value="#FFDADADA"/>
                </MultiTrigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="Selector.IsSelectionActive" Value="True"/>
                        <Condition Property="IsSelected" Value="True"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" TargetName="Bd" Value="#3D26A0DA"/>
                    <Setter Property="BorderBrush" TargetName="Bd" Value="#FF26A0DA"/>
                </MultiTrigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    

    您可以完全制作自己的模板,也可以根据口味更改其中的一些颜色。
    然后使用样式或通过样式设置默认控件模板将其应用于列表框中的所有列表框项(setter 属性模板值...)。

    在您拥有列表框的任何地方的更高级别。或者在 app.xaml 中。

    以下是窗口资源中的示例:

    <Window.Resources>
        <Style TargetType="{x:Type ListBoxItem}" x:Key="{x:Type ListBoxItem}" >
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListBoxItem}">
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
                            <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsMouseOver" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="Pink"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="#A826A0DA"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="False"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="Red"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="#FFDADADA"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="True"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="Orange"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="#FF26A0DA"/>
                            </MultiTrigger>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Items}"/>
    </Grid>
    

    【讨论】:

    • 太好了,非常感谢!没想到现在已经在“ControlTemplate”中查找了几个小时!
    • 我已经编辑了问题供其他人可能回答,但是你知道答案吗?
    • 我已将其添加到我的帖子中。
    • 所以我将该代码放入我的 App.xaml 并且应用程序在启动时崩溃,问题是 x:key="{x:Type ListBoxItem}",因为删除它允许应用程序运行。
    • Edit 导致它崩溃的不是关键,而是控件的代码。我直接从Create as new resource复制了这个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多