在Xaml / Wpf中将ListBoxItems鼠标更改为样式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Xaml / Wpf中将ListBoxItems鼠标更改为样式相关的知识,希望对你有一定的参考价值。

我试图改变一个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(通过属性 - 杂项面板),但是我现在不确定如何设置ControlTemplateListBoxItem,我在Xaml中看不到。 ListBoxItems是在程序运行时通过ItemSource Binding创建的,有没有办法为ControlTemplate设置数据绑定ListBoxItemsListBox

谢谢!

答案

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

在XAML中选择它。 在属性窗口中查看它的属性。找到杂项部分。 在那里有模板。 单击右侧的框并创建为资源。 你获得的(胜利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>

您可以完全制作自己的模板,也可以更改其中一些颜色。 然后使用样式或通过样式设置默认的controltemplate将其应用于列表框中的所有listboxitems(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>

以上是关于在Xaml / Wpf中将ListBoxItems鼠标更改为样式的主要内容,如果未能解决你的问题,请参考以下文章

将 XAML 中 WPF 窗口的启动位置更改为右下角

如何在 WPF 中将宽度设置为 100%

带有按钮的 WPF 列表框样式

如何在C#中将列表与WPF数据网格绑定?

WPF 绑定数据模板

WPF 在控件上淡出