【问题标题】:ControlTemplate doesn't work properly with ListViewControlTemplate 不能与 ListView 一起正常工作
【发布时间】:2019-02-22 10:52:36
【问题描述】:

我是 WPF 新手,所以我的代码可能有点奇怪。很抱歉。

我想更改ListView 的默认 MouseOver 和 Selected 事件。按照网上的说明,我尝试更改ControlTemplate,但效果不佳(默认事件消失,但MouseOver时没有任何反应)。

然后我在ContentPresenter之外添加一个边框,并让触发器改变边框的背景。它有效,但不正确。我的目的是展示这样的东西。

┌──────────────────────────────────────┐
│ ┌─────┐ ────TEXT─────────            │
│ │     │ ────TEXT─────────            │
│ │ IMG │                              │
│ │     │                              │
│ │     │     Mouse Here, Not Trigger  │
│ └─────┘                              │
└──────────────────────────────────────┘ ← Enter Here

如果我的鼠标进入右下角的列表项并且没有在图像或文本上移动,则背景不会改变。如果我点击,它不会被选中。

如果您能告诉我显示数据的正确方式(更多 WPF 方式)而不是仅仅修复模板问题,我们将不胜感激。

ControlTemplate:

<Style TargetType="ListView" x:Key="ListViewStyle"
... // Style for ListView
<Setter Property="ItemContainerStyle">
<Setter.Value>

<Style TargetType="{x:Type ListViewItem}">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="ListViewItemBorder">
                    <ContentPresenter/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" TargetName="ListViewItemBorder" Value="DimGray"/>
                    </Trigger>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" TargetName="ListViewItemBorder" Value="DimGray"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

列表视图:

<ListView x:Name="ListViewCollections" ItemsSource="{Binding}" Style="{StaticResource ListViewStyle}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <DockPanel Style="{StaticResource DockPanelStyle}"> // LastChildFill=False
                <Image Source="{Binding something}"/>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding something}"/>
                    <TextBlock Text="{Binding something}"/>
                </StackPanel>
            </DockPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView

【问题讨论】:

  • 您只是想更改您要完成的任务的默认颜色吗?
  • @mm8 是的,背景和边框。

标签: c# wpf xaml listview controltemplate


【解决方案1】:

您可以将ListViewItem 的默认模板复制到您的XAML 标记中,例如将&lt;ListViewItem /&gt; 元素添加到Blend 中的XAML 文件,右键单击它并选择编辑模板-> 编辑副本。

然后您可以简单地更改 SolidColorBrush 资源的值:

<ListView x:Name="ListViewCollections" ItemsSource="{Binding}">
    <ListView.Resources>
        <SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
        <SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
        <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListView.Resources>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="Padding" Value="4,1"/>
            <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListViewItem}">
                        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                            <ContentPresenter 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="{StaticResource Item.MouseOver.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="False"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
                            </MultiTrigger>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Selector.IsSelectionActive" Value="True"/>
                                    <Condition Property="IsSelected" Value="True"/>
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
                                <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
                            </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>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <DockPanel Style="{StaticResource DockPanelStyle}">
                <Image Source="{Binding something}"/>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding something}"/>
                    <TextBlock Text="{Binding something}"/>
                </StackPanel>
            </DockPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 2014-07-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多