Как изменить фон отключенного элемента управления ListView без изменения ControlTemplate?

Вопрос или проблема

Я хочу изменить фоновый цвет отключенного списка без изменения ControlTemplate.

Поэтому я проверил этот сайт.

https://learn.microsoft.com/ko-kr/dotnet/desktop/wpf/controls/listview-styles-and-templates?view=netframeworkdesktop-4.8

Это мой код XAML.

 <Window.Resources>
    <Style TargetType="{x:Type ListView}">
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/>
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Visible"/>
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="True">
                <!--#region Рабочий -->
                <Setter Property="Background" Value="BlueViolet"/>
                <Setter Property="Foreground" Value="Blue"/>
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="FontSize" Value="40"/>
                <!--#endregion-->
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <!--#region Не рабочий -->
                <Setter Property="Background" Value="Green"/>
                <!--<Setter Property="Background" Value="Green" TargetName="PART_ScrollContentPresenter"/>-->
                <!--#endregion-->

                <!--#region Рабочий -->
                <Setter Property="FontWeight" Value="Bold"/>
                <Setter Property="FontSize" Value="40"/>
                <!--#endregion-->
            </Trigger>
        </Style.Triggers>
        <Style.Resources>
            <!--  Цвет правого нижнего угла ScrollViewer  -->
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="LawnGreen"/>

            <!--  Цвет текста при отключении  -->
            <SolidColorBrush x:Key="{x:Static SystemColors.GrayTextBrushKey}" Color="Red"/>
        </Style.Resources>
    </Style>
</Window.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <ListView Grid.Column="0" Margin="10" SelectedIndex="1">
        <ListViewItem Content="1" Height="100"/>
        <ListViewItem Content="2" Height="100"/>
        <ListViewItem Content="3" Height="100"/>
        <ListViewItem Content="4" Height="100"/>
        <ListViewItem Content="5" Height="100"/>
    </ListView>
    <ListView Grid.Column="1" Margin="10" SelectedIndex="1" IsEnabled="False">
        <ListViewItem Content="1" Height="100"/>
        <ListViewItem Content="2" Height="100"/>
        <ListViewItem Content="3" Height="100"/>
        <ListViewItem Content="4" Height="100"/>
        <ListViewItem Content="5" Height="100"/>
    </ListView>
</Grid>

Первая попытка

Я нашёл название “PART_ScrollContentPresenter” на сайте Microsoft.

Я пытался изменить цвет фона объекта с именем “PART_ScrollContentPresenter”, но не смог найти TargetName.

<Setter Property="Background" Value="Green" TargetName="PART_ScrollContentPresenter"/>

Вторая попытка

Это не сработало.

<Setter Property="Background" Value="Green"/>

Последняя попытка

Я пытался изменить “Style.Resource”.

С помощью этого метода я смог изменить цвет текста отключенного списка.

Но, несмотря на то, что я испробовал все ключи в классе ‘SystemColors’, цвет фона не изменился.

Существует ли способ изменить цвет фона, не трогая ControlTemplate?

<Style.Resources>
            <!--  Цвет правого нижнего угла ScrollViewer  -->
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="LawnGreen"/>

            <!--  Цвет текста при отключении  -->
            <SolidColorBrush x:Key="{x:Static SystemColors.GrayTextBrushKey}" Color="Red"/>
</Style.Resources>

Ответ или решение

Для изменения фона отключенного элемента управления ListView без редактирования его ControlTemplate, можно воспользоваться следующим подходом. К сожалению, стандартный стиль ListView не позволяет напрямую изменять цвет фона для его отключенной версии. Однако, есть обходной путь, который можно применить, используя VisualBrush.

Вот как можно это сделать:

  1. Создайте вспомогательный элемент, например, Border, который будет оборачивать ваш ListView. Это позволит вам сохранить возможность управления стилем.

  2. Используйте триггер в стиле Border, чтобы изменять фон, когда ListView отключен.

Вот пример кода XAML, который реализует данный подход:

<Window x:Class="YourNamespace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style TargetType="Border">
            <Setter Property="Background" Value="Transparent"/>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Background" Value="Green"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListView Grid.Column="0" Margin="10" SelectedIndex="1">
            <ListViewItem Content="1" Height="100"/>
            <ListViewItem Content="2" Height="100"/>
            <ListViewItem Content="3" Height="100"/>
            <ListViewItem Content="4" Height="100"/>
            <ListViewItem Content="5" Height="100"/>
        </ListView>

        <Border Grid.Column="1" Margin="10" IsEnabled="False">
            <ListView>
                <ListViewItem Content="1" Height="100"/>
                <ListViewItem Content="2" Height="100"/>
                <ListViewItem Content="3" Height="100"/>
                <ListViewItem Content="4" Height="100"/>
                <ListViewItem Content="5" Height="100"/>
            </ListView>
        </Border>
    </Grid>
</Window>

В этом примере контрол ListView расположен внутри элемента Border, который изменяет свой фон на зеленый, когда ListView отключен. При этом, не требуется изменение стандартного шаблона контроля.

Дополнительные примечания:

  • Для дальнейшей настройки можно использовать дополнительные свойства Border, такие как CornerRadius, Padding, и т.д.
  • Убедитесь, что сохранены нужные настройки внешнего вида (отступы, размеры), которые могут быть потеряны при использовании Border.
  • Это решение также позволяет избегать изменения системы управления, что делает его менее рискованным.

Таким образом, вы можете добиться нужного эффекта изменения фона для отключенного ListView, не затрагивая его ControlTemplate.

Оцените материал
Добавить комментарий

Капча загружается...