Как рисовать определенные строки в списке (приложение WPF)

Я пишу проект, который включает окно WPF, содержащее список. список использует привязку к списку задач (класс, который я создал). Я пытаюсь нарисовать некоторые определенные строки списка, а некоторые определенные строки иметь цветные границы на основе полей элементов в списке. как добавить метод рисования/кисти для определенных строк в список, а не для всего списка? Ниже приведены свойства XAML списка:

<ListBox Name="Tasks" HorizontalAlignment="Left" ItemsSource="{Binding Path=Tasks,Mode=TwoWay}" Height="199" Margin="303,97,0,0" VerticalAlignment="Top" Width="439" RenderTransformOrigin="0.5,0.5">
            <ListBox.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform Angle="0.294"/>
                    <TranslateTransform/>
                </TransformGroup>
            </ListBox.RenderTransform>
        </ListBox>

person George    schedule 02.06.2020    source источник
comment
Отвечает ли это на ваш вопрос Элемент списка WPF, другой цвет фона для разных элементы   -  person neelesh bodgal    schedule 02.06.2020
comment
ListBox.ItemContainerStyle — укажите собственный стиль для ListBoxItems в этом свойстве. Вы можете установить BorderBrush и фон ListBoxItems   -  person ASh    schedule 02.06.2020


Ответы (1)


ItemsControl имеет специальную функцию для выбора шаблонов для элементов, отображаемых в элементе управления. В следующем примере я иллюстрирую использование DataTemplateSelector

Сначала XAML. В разделе ресурсов определены разные шаблоны данных для разных типов элементов, которые вы хотите отобразить в ListBox, и есть ссылка на DataTemplateSelector (определенный в коде C# позже):

<Window x:Class="TestWpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestWpfApp"
        mc:Ignorable="d"
        x:Name="DataWindow"
        WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
   <Window.Resources>
      <!-- The data template selector -->
      <local:DataItemTemplateSelector x:Key="DataItemTemplateSelector"/>
      <!-- Data template for a normal data item -->
      <DataTemplate x:Key="NormalDatatemplate">
         <Border Width="200"
                 Margin="0"
                 Background="White"
                 BorderThickness="2"
                 Padding="3"
                 BorderBrush="Transparent">
            <TextBlock VerticalAlignment="Center"
                       HorizontalAlignment="Stretch"
                       FontSize="20"
                       Foreground="Black"
                       Background="Transparent"
                       Text="{Binding Path=Header}"/>
         </Border>
      </DataTemplate>
      <!-- Data template for a special data item -->
      <DataTemplate x:Key="SpecialDatatemplate">
         <Border Width="200"
                 Margin="0"
                 Background="Yellow"
                 BorderThickness="2"
                 Padding="3"
                 BorderBrush="Blue">
            <TextBlock VerticalAlignment="Center"
                       HorizontalAlignment="Stretch"
                       FontSize="20"
                       Foreground="Black"
                       Background="Transparent"
                       Text="{Binding Path=Header}"/>
         </Border>
      </DataTemplate>
   </Window.Resources>
   <Grid>
      <ListBox x:Name="DataListBox"   
               Margin="50"
               Width="Auto"
               Height="Auto"
               HorizontalAlignment="Center"
               VerticalAlignment="Top"
               ItemsSource="{Binding ElementName=DataWindow, Path=DataList}"
               ItemTemplateSelector="{StaticResource ResourceKey=DataItemTemplateSelector}"/>
   </Grid>
</Window>

И затем код C#, там определен DataItemTemplateSelector и DataList с некоторыми тестовыми данными:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace TestWpfApp
{
   // Different types of items on the list
   public enum DataItemType
   {
      Normal,
      Special
   }
   // Items on the list
   public class DataItem
   {
      public string Header { set; get; }
      public DataItemType DataType { set; get; }
   }
   // Data template selector for items on the list
   public class DataItemTemplateSelector : DataTemplateSelector
   {
      public override DataTemplate SelectTemplate(object dataItem, DependencyObject container)
      {
         // Check that everyting is OK
         if ((dataItem != null) && (dataItem is DataItem))
         {
            // Switch on the data type
            switch (((DataItem)(dataItem)).DataType)
            {
               case DataItemType.Normal:
                  // Return the data template for a normal data item 
                  return Application.Current.MainWindow.FindResource("NormalDatatemplate") as DataTemplate;
               case DataItemType.Special:
                  // Return the data template for a special data item 
                  return Application.Current.MainWindow.FindResource("SpecialDatatemplate") as DataTemplate;
               default:
                  return null;
            }
         }
         return null;
      }
   }
   /// <summary>
   /// Interaction logic for MainWindow.xaml
   /// </summary>
   public partial class MainWindow : Window
   {
      // The list of data to show in the list box
      public List<DataItem> DataList { set; get; }
      // The constructor of the main window
      public MainWindow()
      {
         // Some test data
         this.DataList = new List<DataItem>();
         this.DataList.Add(new DataItem() { Header = "Item 1", DataType = DataItemType.Normal });
         this.DataList.Add(new DataItem() { Header = "Item 2", DataType = DataItemType.Normal });
         this.DataList.Add(new DataItem() { Header = "Item 3", DataType = DataItemType.Special });
         this.DataList.Add(new DataItem() { Header = "Item 4", DataType = DataItemType.Normal });
         // Initializing the window
         InitializeComponent();
      }
   }
}

Я надеюсь, что вы поняли идею использования DataTemplateSelector, и тогда вы сможете стилизовать свой ListBox и различные типы элементов в нем.

person Anders H    schedule 02.06.2020