Как изменить цвет фона заголовка listview WPF
Как я могу изменить остальные цвета фона заголовка в listview WPF C#.
Поделиться Источник 12 января 2016 в 14:01
1 ответ
Вы можете применить стиль к GridViewColumnHeader
Поделиться 12 января 2016 в 14:08
Шаблоны ячеек ListView

Свойство GridViewColumn.DisplayMemberBinding не является единственным способом для отображения данных в ячейке. Вместо него можно использовать свойство CellTemplate, которое принимает шаблон данных. Этот шаблон данных отличается тем, что он применяется лишь к одному конкретному столбцу. При желании разработчика у каждого столбца может быть собственный шаблон данных.
Шаблоны ячеек (CellTemplate) являются ключевым фрагментом головоломки при настройке GridView. К числу наиболее важных из предоставляемых ими возможностей относится перенос текста. Обычно текст в столбце переносится в однострочном элементе TextBlock. Однако эту деталь можно легко изменить, создав собственный шаблон данных со своей схемой деления:
Обратите внимание, что для того, чтобы перенос дал результат, ширину столбца необходимо ограничить с помощью свойства Width. Тогда в случае изменения пользователем размера столбца текст будет переноситься заново соответствующим образом. Ограничивать ширину элемента TextBlock не нужно, поскольку тогда текст будет иметь одинаковый размер, каким бы широкими или узким его не делал пользователь.
Единственным ограничением в этом примере является то, что шаблон данных должен явным образом привязываться к отображаемому свойству. Поэтому создать шаблон, обеспечивающий перенос, и использовать его повторно для каждого фрагмента содержимого нельзя. Вместо этого понадобится создать отдельный шаблон для каждого поля. В данном примере это не проблема, но в случае создания более сложного шаблона, который можно было бы применять и к другим спискам (например, шаблона, преобразующего данные в изображение и отображающего его в элементе Image, или шаблона, использующего элемент управления TextBox для обеспечения возможности редактирования), это может оказаться утомительным.
Простого способа для повторного использования любого шаблона на множестве столбцов не существует: вместо этого придется вырезать и вставлять шаблон, а затем изменять привязку.
Было бы совсем неплохо создать шаблон данных, включающий свойство DisplayMemberBinding. Тогда DisplayMemberBinding можно было бы применять для извлечения необходимого свойства, a CellTemplate — для форматирования находящегося в нем содержимого в подходящее визуальное представление. К сожалению, такой вариант просто не возможен. В случае, когда устанавливаются оба свойства DisplayMember и CellTemplate, класс GridViewColumn использует для установки содержимого ячейки свойство DisplayMember, а шаблон просто игнорирует.
Возможности шаблонов данных не ограничиваются только возможностью настройки свойств элемента TextBlock. Шаблоны данных можно также использовать и для предоставления совершенно других элементов.
Например, в следующем столбце шаблон данных применяется для отображения рисунка. Конвертер ProductImagePath отвечает за загрузку соответствующего файла изображения из файловой системы:

При создании шаблона данных можно определить его как внутристрочный (что и было сделано в двух предыдущих примерах) или сослаться на ресурс, определенный в другом месте. Поскольку шаблоны столбцов нельзя использовать повторно для различных полей, обычно наиболее правильным подходом является все-таки первый вариант.
Шаблоны можно варьировать, чтобы разные элементы данных получали разные шаблоны. Для этого необходимо создать селектор шаблонов, выбирающий подходящий шаблон на основании свойств находящегося в конкретной позиции объекта данных. Если такая функциональная возможность необходима, создайте селектор и примените его для установки свойства GridViewColumn.CellTemplateSelector.
Настройка заголовков столбцов
Шаблоны ячеек не являются единственными шаблонами, которые можно применять с ListView. Можно также использовать и шаблоны заголовков столбцов для изменения внешнего вида заголовков столбцов, если стандартный прямоугольник с серой заливкой не устраивает.
Пока что было показано только, каким образом настраивать внешний вид значений в каждой ячейке. Однако изменение внешнего вида заголовков столбцов еще не демонстрировалось. Тех, кого стандартные прямоугольники с серой заливкой не впечатляют, несомненно, обрадует тот факт, что содержимое и внешний вид заголовков столбцов можно изменять так же легко, как и значения столбцов. На самом деле существует даже несколько вариантов.
При желании оставить стандартные прямоугольники с серой заливкой, но заполнить их своим собственным содержимым, можно установить свойство GridViewColumn.Header. В предыдущих примерах свойство Header использовалось с обычным текстом, но вместо него можно предоставить и, например, элемент StackPanel, упаковывающий элементы TextBlock и Image, и создать необычный заголовок с текстом и рисунком внутри.
Если требуется заполнить заголовки столбцов собственным содержимым, но не указывать это содержимое отдельно для каждого столбца, можно воспользоваться свойством GridViewColumn.HeaderTemplate для определения подходящего шаблона данных. Этот шаблон данных привязывается к любому объекту, который был указан в свойстве GridViewColumn.Header, и представляет его соответствующим образом.
Чтобы изменить форматирование конкретного заголовка столбца, необходимо с помощью свойства GridViewColumn.HeaderContainerStyle предоставить нужный стиль. Для переформатирования всех заголовков столбцов одинаковым образом следует использовать свойство GridView.ColumnHeaderContainerStyle.
Но если необходимо полностью изменить внешний вид заголовка (например, заменить прямоугольник с серой заливкой на границу со скругленными углами и фоном голубого цвета), можно предоставить для него совершенно новый шаблон элемента управления. Чтобы сделать это для одного конкретного столбца, следует воспользоваться свойством GridViewColumn.HeaderTemplate, а для всех столбцов сразу — свойством GridView.ColumnHeaderTemplate. Вдобавок также можно применить и селектор шаблонов для выбора правильного шаблона для данного заголовка, установив свойство GridViewColumn.HeaderTemplateSelector или GridView.ColumnHeaderTemplateSelector.
Как изменить цвет listview wpf
Народ, как изменить цвет селектора ListView при условии что контрол находится не в фокусе, или это импасибл.
Re: C# Как изменить цвет селектора неактивного ListView
| От: | Dron247 |
| Дата: | 08.02.11 01:18 |
| Оценка: |
Здравствуйте, alexparser, Вы писали:
A>Приветствую!
A>Народ, как изменить цвет селектора ListView при условии что контрол находится не в фокусе, или это импасибл.
A>Сенькс!
Wut?? Ты хоть картинок запили со стрелочками, ниче не понял че те надо. Ты про обводку вокруг выбранного элемента?
Твой IP на моем юзербаре
Re[2]: C# Как изменить цвет селектора неактивного ListView
| От: | Codechanger |
| Дата: | 08.02.11 07:06 |
| Оценка: |
Здравствуйте, Dron247, Вы писали:
D>Здравствуйте, alexparser, Вы писали:
A>>Приветствую!
A>>Народ, как изменить цвет селектора ListView при условии что контрол находится не в фокусе, или это импасибл.
A>>Сенькс!
D>Wut?? Ты хоть картинок запили со стрелочками, ниче не понял че те надо. Ты про обводку вокруг выбранного элемента?
Еще можно было бы озвучить технологии.
Re: C# Как изменить цвет селектора неактивного ListView
| От: | андрей_к |
| Дата: | 08.02.11 08:06 |
| Оценка: |
A>Народ, как изменить цвет селектора ListView при условии что контрол находится не в фокусе, или это импасибл.
и соответственно у листа
ItemContainerStyle=""
Re[3]: C# Как изменить цвет селектора неактивного ListView
| От: | Dron247 |
| Дата: | 08.02.11 08:09 |
| Оценка: |
Здравствуйте, Codechanger, Вы писали:
C>Еще можно было бы озвучить технологии.
Точно, еще-ж технологии, пересаживаюсь на wpf в последнее время, даже мысли такой не возникло Оно-ж и в винформсе, и в впф, и в gtk# и в webforms. Короче ждем-с
Твой IP на моем юзербаре
Re[2]: C# Как изменить цвет селектора неактивного ListView
| От: | alexparser |
| Дата: | 08.02.11 15:11 |
| Оценка: |
Здравствуйте, андрей_к, Вы писали:
Да, я проект на VS2008 C#, еще вопрос, а как теперь применить к ListView этот XML код?
Re[3]: C# Как изменить цвет селектора неактивного ListView
| От: | Dron247 |
| Дата: | 09.02.11 01:46 |
| Оценка: |
Здравствуйте, alexparser, Вы писали:
A>Здравствуйте, андрей_к, Вы писали:
A>Да, я проект на VS2008 C#, еще вопрос, а как теперь применить к ListView этот XML код?
A>Спасибо
Эмм. срочно сделай скриншот студии, где открыта твоя форма, иначе нет смысла говорить дальше
Твой IP на моем юзербаре
Re[4]: C# Как изменить цвет селектора неактивного ListView
| От: | alexparser |
| Дата: | 09.02.11 20:57 |
| Оценка: |
Здравствуйте, Dron247, Вы писали:
D>Здравствуйте, alexparser, Вы писали:
A>>Здравствуйте, андрей_к, Вы писали:
A>>Да, я проект на VS2008 C#, еще вопрос, а как теперь применить к ListView этот XML код?
A>>Спасибо
D>Эмм. срочно сделай скриншот студии, где открыта твоя форма, иначе нет смысла говорить дальше
Вот скрин студии с нужным ListView.
Re[5]: C# Как изменить цвет селектора неактивного ListView
| От: | Dron247 |
| Дата: | 10.02.11 02:32 |
| Оценка: |
Здравствуйте, alexparser, Вы писали:
Это WindowsForms, в будущем указывайте используемые технологии в заголовке или в посте.
Для винформса вам придется: либо использовать сторонний компонент, либо писать свой, на основе этого, и переопределять цвет выделения (например добавить свойство, определяющее цвет, и при использовании указывать желаемый).
Твой IP на моем юзербаре
Re[6]: C# Как изменить цвет селектора неактивного ListView
| От: | alexparser |
| Дата: | 10.02.11 10:32 |
| Оценка: |
Здравствуйте, Dron247, Вы писали:
D>Здравствуйте, alexparser, Вы писали:
D>Это WindowsForms, в будущем указывайте используемые технологии в заголовке или в посте.
D>Для винформса вам придется: либо использовать сторонний компонент, либо писать свой, на основе этого, и переопределять цвет выделения (например добавить свойство, определяющее цвет, и при использовании указывать желаемый).
Это понятно, но что конкретно.
Вот человек предложил xaml, а как его применить к ListView, если можно что-то конкретное.
Re[7]: C# Как изменить цвет селектора неактивного ListView
| От: | HowardLovekraft |
| Дата: | 10.02.11 11:58 |
| Оценка: |
Здравствуйте, alexparser, Вы писали:
A>Вот человек предложил xaml, а как его применить к ListView, если можно что-то конкретное.
Если речь о ListView из WinForms, то установите ListView.OwnerDraw в значение true, добавьте обработчики событий DrawItem, DrawSubItem и DrawColumnHeader, и там рисуйте, все, что душе угодно.
Если вы все еще хотите применить предложенный XAML, то выбрасывайте Windows Forms и начинайте осваивать WPF.
Re[8]: C# Как изменить цвет селектора неактивного ListView
| От: | Sergey_BG |
| Дата: | 10.02.11 15:13 |
| Оценка: |
Здравствуйте, HowardLovekraft, Вы писали:
HL>Если речь о ListView из WinForms, то установите ListView.OwnerDraw в значение true, добавьте обработчики событий DrawItem, DrawSubItem и DrawColumnHeader, и там рисуйте, все, что душе угодно.
public partial class MyListViewN : ListView < public MyListView() < InitializeComponent(); OwnerDraw = true; > // Пока он рисуется как и раньше, но здесь в случае если элемент выбранный можно поменять алгоритм // "e" содержит функции которые помогут это сделать. protected override void OnDrawItem(DrawListViewItemEventArgs e) < e.DrawDefault = true; base.OnDrawItem(e); > protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e) < e.DrawDefault = true; base.OnDrawSubItem(e); > protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e) < e.DrawDefault = true; base.OnDrawColumnHeader(e); > >
ListView, привязка данных и шаблоны элементов списка
В предыдущей статье мы заполняли ListView вручную с помощью XAML кода, но WPF также позволяет использовать привязку данных. Концепция привязки данных детально объясняется в другой части этого руководства, но, вообще говоря, всё дело в отделении данных от разметки. Итак, давайте попробуем привязать некоторые данные к ListView.
using System; using System.Collections.Generic; using System.Windows; namespace WpfTutorialSamples.ListView_control < public partial class ListViewDataBindingSample : Window < public ListViewDataBindingSample() < InitializeComponent(); Listitems = new List(); items.Add(new User() < Name = "John Doe", Age = 42 >); items.Add(new User() < Name = "Jane Doe", Age = 39 >); items.Add(new User() < Name = "Sammy Doe", Age = 13 >); lvDataBinding.ItemsSource = items; > > public class User < public string Name < get; set; >public int Age < get; set; >> >
Мы заполняем список наших собственных объектов класса User, каждый объект имеет свойства для имени (Name) и возраста (Age). Процесс привязки данных происходит автоматически как только мы присваиваем переменную списка свойству ItemSource ListView, но результат выглядит немного обескураживающим:

Каждый «пользователь» представлен в ListView именем собственного типа. Это ожидаемо, потому что .NET не имеет представления о том как вы хотите отображать данные, поэтому он просто вызывает метод ToString() для каждого объекта и использует его результат для представления элемента.
Мы можем использовать это для нашей пользы и переопределить метод ToString(), чтобы получить более осмысленный вывод. Попробуем заменить класс User следующей версией:
public class User < public string Name < get; set; >public int Age < get; set; >public override string ToString() < return this.Name + ", " + this.Age + " years old"; >>

Это выглядит уже более удобным для отображения и может сгодиться во многих случаях, но простое строковое представление довольно негибкое. Возможно вы хотите чтобы часть текста была выделена жирным или имела другой цвет? Или вы хотите получить картинку? К счастью, WPF позволяет делать все это с помощью простого использования шаблонов.
ListView использующий ItemTemplate
WPF весь построен на шаблонах, так что описать шаблон данных для ListView очень легко. В этом примере мы будем делать собственную обвязку форматирования для каждого элемента, просто чтобы показать как гибко это делает WPF ListView.
" FontWeight="Bold" /> " FontWeight="Bold" /> " TextDecorations="Underline" Foreground="Blue" Cursor="Hand" />
using System; using System.Collections.Generic; using System.Windows; namespace WpfTutorialSamples.ListView_control < public partial class ListViewItemTemplateSample : Window < public ListViewItemTemplateSample() < InitializeComponent(); Listitems = new List(); items.Add(new User() < Name = "John Doe", Age = 42, Mail = "john@doe-family.com" >); items.Add(new User() < Name = "Jane Doe", Age = 39, Mail = "jane@doe-family.com" >); items.Add(new User() < Name = "Sammy Doe", Age = 13, Mail = "sammy.doe@gmail.com" >); lvDataBinding.ItemsSource = items; > > public class User < public string Name < get; set; >public int Age < get; set; >public string Mail < get; set; >> >

Мы использовали пачку TextBlock-ов для построения каждого элемента, где мы отметили части, которые должны быть выделены жирным. Для адресов электронной почты, которые мы добавили в этом примере, мы добавили подчеркивание, синий цвет и изменение указателя мыши, чтобы они выглядели как гиперссылки.
Заключение
Используя шаблон элемента ItemTemplate и привязку данных мы создали прикольную реализацию ListView. Однако, она все еще выглядит как все тот же ListBox. Самый распространенный сценарий для ListView это наличие колонок, иногда (как в WinForms, например) ссылающихся на детальное представление. WPF включает в себя готовые классы для управления этим, о которых мы поговорим в следующей главе.
This article has been fully translated into the following languages:
Is your preferred language not on the list? Click here to help us translate this article into your language!