Вопрос или проблема
Я хочу изменить фоновый цвет отключенного списка без изменения ControlTemplate.
Поэтому я проверил этот сайт.
Это мой код 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
.
Вот как можно это сделать:
-
Создайте вспомогательный элемент, например,
Border
, который будет оборачивать вашListView
. Это позволит вам сохранить возможность управления стилем. - Используйте триггер в стиле
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
.