ControlTemplate неправильно работает с ListView

Я новичок в WPF, поэтому мой код может быть немного странным. Простите за это.

Я хочу изменить событие MouseOver и Selected по умолчанию для ListView. Следуя онлайн-инструкциям, я попытался изменить ControlTemplate, но это не работает (событие по умолчанию исчезло, но при наведении мыши ничего не происходит).

Затем я добавляю рамку за пределами 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 22.02.2019 12:01

@ mm8 Да, фон и кисть.

kiiirzzz 22.02.2019 12:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете скопировать шаблон по умолчанию для ListViewItem в разметку XAML, например, добавив элемент <ListViewItem /> в файл XAML в Blend, щелкните его правой кнопкой мыши и выберите «Редактировать шаблон» -> «Редактировать копию».

Затем вы можете просто изменить значения ресурсов 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>

Другие вопросы по теме