WPF TreeView: как стилизовать выбранные элементы с закругленными углами, как в Explorer

Выбранный элемент в WPF TreeView имеет темно-синий фон с «острыми» углами. Сегодня это выглядит немного устаревшим:

WPF выбрал TreeViewItem с фокусом или без него

Я хотел бы изменить фон, чтобы он выглядел как в проводнике Windows 7 (с / без фокуса):

Выбран Explorer TreeViewItemExplorer TreeViewItem выбран без фокуса

То, что я пробовал до сих пор, не снимает оригинальный темно-синий фон, а рисует закругленную границу сверху, чтобы вы увидели темно-синий цвет по краям и с левой стороны – уродливый.

введите описание изображения здесь

Интересно, что когда моя версия не имеет фокуса, она выглядит довольно хорошо:

введите описание изображения здесь

Я хотел бы воздержаться от пересмотра шаблона управления, как показано здесь или здесь . Я хочу установить минимальные требуемые свойства, чтобы сделать выбранный элемент похожим на Explorer.

Альтернатива: Я также был бы рад, если бы сфокусированный выбранный элемент выглядел так, как будто мой сейчас делает, когда он не имеет фокуса. При потере фокуса цвет должен меняться от синего до серого.

Вот мой код:

                        

Решение

Благодаря отличным ответам Sheridan и Meleak мой TreeView теперь выглядит так в коде (результат я очень доволен и довольно близок к стилю Explorer):

 <TreeView ...                                                            

Добавление к ответу @ Шеридан
Это не 100% -ный точный результат, но должен быть довольно близок (он использует цвета из GridView который близок к Windows Explorer)

введите описание изображения здесь

                    

Добавьте это в свой TreeView.ContainerStyle чтобы удалить blue фон по умолчанию.

       

Вы можете заменить Black цвет каким бы то ни было цветом текста вашего предмета и текста выбранного элемента.

Чтобы иметь серый фон, когда он не сфокусирован, вы можете настроить « EventTrigger » Style с серым EventTrigger и использовать EventTrigger s в событиях TreeViewItem.GotFocus и LostFocus для переключения между LostFocus s.

EDIT >>>

Если вы хотите быть флеш-памятью, вы можете использовать анимацию для изменения цвета фона, добавив триггеры в свою ItemBorder Border прямо в ваш HierarchicalDataTemplate следующим образом:

                     

Обратите внимание, что это будет работать, только если ColorAnimation имеет цвет From . Поскольку этот код стоит, среда выполнения будет искать набор Border.Background свойстве Border.Background , поэтому вы должны установить его. Вы можете установить свойство ColorAnimation.From прямо.

Стиль WindowsView TreeView (и ListView)

Первоначально я искал способ применения цветовой схемы Windows 10 к TreeViewItem, включая

  • IsMouseOver только для текущего элемента
  • Windows 10, которые WPF уже применяет к ListBox (не Windows Explorer)

Если кто-то из вас ищет именно это, пожалуйста, не стесняйтесь принимать код ниже. Я использовал решение Helge Klein для проблемы IsMouseOver и применил цвета Windows 10 к XAML. Поэтому я предлагаю это как дополнение к принятому ответу.

Также см. Ниже слово для ListView и ComboBox .


Скриншот

пример

App.xaml

   

TreeViewItemHelper ( Источник, опубликованный Хельге Клейном, незначительные изменения / упрощение )

 public static class TreeViewItemHelper { private static TreeViewItem CurrentItem; private static readonly RoutedEvent UpdateOverItemEvent = EventManager.RegisterRoutedEvent("UpdateOverItem", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TreeViewItemHelper)); private static readonly DependencyPropertyKey IsMouseDirectlyOverItemKey = DependencyProperty.RegisterAttachedReadOnly("IsMouseDirectlyOverItem", typeof(bool), typeof(TreeViewItemHelper), new FrameworkPropertyMetadata(null, new CoerceValueCallback(CalculateIsMouseDirectlyOverItem))); public static readonly DependencyProperty IsMouseDirectlyOverItemProperty = IsMouseDirectlyOverItemKey.DependencyProperty; static TreeViewItemHelper() { EventManager.RegisterClassHandler(typeof(TreeViewItem), UIElement.MouseEnterEvent, new MouseEventHandler(OnMouseTransition), true); EventManager.RegisterClassHandler(typeof(TreeViewItem), UIElement.MouseLeaveEvent, new MouseEventHandler(OnMouseTransition), true); EventManager.RegisterClassHandler(typeof(TreeViewItem), UpdateOverItemEvent, new RoutedEventHandler(OnUpdateOverItem)); } public static bool GetIsMouseDirectlyOverItem(DependencyObject obj) { return (bool)obj.GetValue(IsMouseDirectlyOverItemProperty); } private static object CalculateIsMouseDirectlyOverItem(DependencyObject item, object value) { return item == CurrentItem; } private static void OnUpdateOverItem(object sender, RoutedEventArgs e) { CurrentItem = sender as TreeViewItem; CurrentItem.InvalidateProperty(IsMouseDirectlyOverItemProperty); e.Handled = true; } private static void OnMouseTransition(object sender, MouseEventArgs e) { lock (IsMouseDirectlyOverItemProperty) { if (CurrentItem != null) { DependencyObject oldItem = CurrentItem; CurrentItem = null; oldItem.InvalidateProperty(IsMouseDirectlyOverItemProperty); } Mouse.DirectlyOver?.RaiseEvent(new RoutedEventArgs(UpdateOverItemEvent)); } } } 

ListBox / ListView и ComboBox: в Windows 7 (и 8?) Это приведет к различию дизайна TreeView с ListBox / ListView и ComboBox. Поэтому, если вы хотите применить эту цветовую схему к этим типам управления, также используйте это:

    
  • Стиль текстового поля в JasperReports
  • Допустимые значения для android: fontFamily и на что они направлены?
  • Как получить атрибуты стиля программно из styles.xml
  • Стиль кнопки WPF C #
  • Как изменить цвет линии в EditText
  • Как отключить эффекты MouseOver для кнопки в WPF?
  • Interesting Posts

    Могу ли я обновить свой ноутбук

    Доступ к внешнему компьютеру без переадресации портов

    Android: Клавиатура перекрывается с помощью EditText (с печатными экранами)

    Какова правильная конфигурация антенны для модуля Intel Centrino 6300 на Dell Studio XPS 16?

    Мое регулярное выражение слишком много. Как я могу сказать, что он соответствует наименьшему возможному шаблону?

    Математическая дивизия в Свифте

    В WPF, как я могу определить, является ли элемент управления видимым для пользователя?

    Правильный способ возврата JSON с помощью узла или Express

    Как программно добавлять элементы управления в форму в VB.NET

    Использование Java с графическим процессором Nvidia (cuda)

    Как заставить многие формулы столбцов игнорировать те же строки в Excel?

    Вызов динамической функции Java

    Преобразование RGB в оттенки серого / интенсивность

    Получить контекст приложения из classа non activity singleton

    Каков наиболее практичный метод безопасности для домашней беспроводной сети?

    Давайте будем гением компьютера.