簡體   English   中英

c#listview中的多種顏色(wpf)

[英]c# multiple colors in listview (wpf)

我在 WPF 中制作了一個列表視圖,我希望它會顯示一些具有多種顏色的項目(例如: http : //i.stack.imgur.com/Xi43d.png )。
這是我的列列表視圖:

<ListView x:Name="listView" Margin="0,27,0,0">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Server Name" DisplayMemberBinding="{Binding ServerName}"/>
                <GridViewColumn Header="Players" DisplayMemberBinding="{Binding Players}"/>
                <GridViewColumn Header="Map" DisplayMemberBinding="{Binding Map}"/>
                <GridViewColumn Header="Game Type" DisplayMemberBinding="{Binding GameType}"/>
                <GridViewColumn Header="Ip" DisplayMemberBinding="{Binding Ip}"/>
            </GridView>
        </ListView.View>
    </ListView>

我使用以下代碼添加項目:

listView.Items.Add(new Server { ServerName = "GunMoney", Players = "0/16", Map = "ut4_asd", GameType = "FFA", Ip = "127.0.0.0:27960" });

public class Server
{
    public string ServerName { get; set; }
    public string Players { get; set; }
    public string Map { get; set; }
    public string GameType { get; set; }
    public string Ip { get; set; }
}

我想找到一種方法來制作這樣的文本:^2Gun^3Money 它將以不同的顏色顯示(^2 表示哪種顏色)

據我所知,您需要某種機制將字符串 ^2Gun^3Money 轉換為字符串顏色對集合並將其顯示在數據網格單元格中。 如果是這樣,這里有一些該問題的解決方案: 1. XAML 代碼:

<Window x:Class="SoGridViewHelpAttempt.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:soGridViewHelpAttempt="clr-namespace:SoGridViewHelpAttempt"
    xmlns:system="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <DataTemplate x:Key="ServerNameCellTemplate" DataType="soGridViewHelpAttempt:ServerNameObject">
        <ListBox ItemsSource="{Binding ServerNamePartsCollection}" BorderBrush="#00000000" BorderThickness="2">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal"></StackPanel>
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="ContentTemplate">
                        <Setter.Value>
                            <DataTemplate DataType="soGridViewHelpAttempt:ServerNameParts">
                                <TextBlock IsHitTestVisible="False" Text="{Binding NamePart}" Background="{Binding NamePartBrush}"></TextBlock>
                            </DataTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
        </ListBox>
    </DataTemplate>
    <x:Array x:Key="ColorValuePairs" Type="soGridViewHelpAttempt:ColorAndKey">
        <soGridViewHelpAttempt:ColorAndKey Key="^1" Brush="Red"/>
        <soGridViewHelpAttempt:ColorAndKey Key="^2" Brush="Green"/>
        <soGridViewHelpAttempt:ColorAndKey Key="^3" Brush="Blue"/>
    </x:Array>
    <soGridViewHelpAttempt:ServerNameString2ColorNamePartValuesConverter x:Key="ServerNameString2ColorNamePartValuesConverterKey" BrushMap ="{StaticResource ColorValuePairs}"/>
</Window.Resources>
<Window.DataContext>
    <soGridViewHelpAttempt:DataGridMAinViewModel/>
</Window.DataContext>
<Grid>
    <ListView x:Name="ListView" Margin="0,27,0,0" ItemsSource="{Binding ServerDataCollection}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Server Name">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="soGridViewHelpAttempt:Server">
                            <ContentControl x:Name="ServerNamePresenter" Content="{Binding ServerName, Converter={StaticResource ServerNameString2ColorNamePartValuesConverterKey}}" ContentTemplate="{StaticResource ServerNameCellTemplate}"></ContentControl>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Players" DisplayMemberBinding="{Binding Players}"/>
                <GridViewColumn Header="Map" DisplayMemberBinding="{Binding Map}"/>
                <GridViewColumn Header="Game Type" DisplayMemberBinding="{Binding GameType}"/>
                <GridViewColumn Header="Ip" DisplayMemberBinding="{Binding Ip}"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

解釋; 1) ServerNameCellTemplate 是數據網格單元格的模板。 這是一個列表框,在文本塊中顯示名稱的一部分,並根據提供的鍵定義文本塊畫筆。 2)ServerNameString2ColorNamePartValuesConverter 將提供的字符串轉換為部分名稱及其畫筆對象。 3)ColorValuePairs 可用顏色。 2.ViewModel代碼(提供ListView ItemsSource):

  public class DataGridMAinViewModel:BaseObservableObject
{
    public DataGridMAinViewModel()
    {
        ServerDataCollection = new ObservableCollection<Server>(new List<Server>
        {
            new Server { 
                ServerName = "^1Gun^3Money",
            Players = "0/16", Map = "ut4_asd", GameType = "FFA", Ip = "127.0.0.0:27960" },
             new Server { ServerName = "^2Gun^1Money",
            Players = "0/16", Map = "ut4_asd", GameType = "FFA", Ip = "127.0.0.0:27960" },
             new Server { ServerName = "^2Gun^3Money",
            Players = "0/16", Map = "ut4_asd", GameType = "FFA", Ip = "127.0.0.0:27960" },
        });
    }
    public ObservableCollection<Server> ServerDataCollection { get; set; }
}

3.服務器型號:

public class Server:BaseObservableObject
{
    private string _serverName;
    private string _players;
    private string _map;
    private string _gameType;
    private string _ip;

    public string ServerName
    {
        get { return _serverName; }
        set
        {
            _serverName = value;
            OnPropertyChanged();
        }
    }

    public string Players
    {
        get { return _players; }
        set
        {
            _players = value;
            OnPropertyChanged();
        }
    }

    public string Map
    {
        get { return _map; }
        set
        {
            _map = value;
            OnPropertyChanged();
        }
    }

    public string GameType
    {
        get { return _gameType; }
        set
        {
            _gameType = value;
            OnPropertyChanged();
        }
    }


    public string Ip
    {
        get { return _ip; }
        set
        {
            _ip = value;
            OnPropertyChanged();
        }
    }
}

4、轉換器及其型號:

    public class ServerNameString2ColorNamePartValuesConverter : IValueConverter
{


    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var name = value.ToString();
        var verbalNameParts = name.Split(BrushMap.Select(item => item.Key).ToArray(), StringSplitOptions.RemoveEmptyEntries);
        var colorKeyNameParts = name.Split(verbalNameParts, StringSplitOptions.RemoveEmptyEntries);
        if (verbalNameParts.Length != colorKeyNameParts.Length) return null;
        var index = 0;
        var nameMappedToColors = new ObservableCollection<ServerNameParts>();
        verbalNameParts.ToList().ForEach(namePart =>
        {
            var brush = BrushMap.FirstOrDefault(item => item.Key == colorKeyNameParts[index]);
            if(brush == null) return;
            nameMappedToColors.Add(new ServerNameParts
           {
               NamePart = namePart,
               NamePartBrush = brush.Brush,
           });
            index++;
        });

        return new ServerNameObject{ServerNamePartsCollection = nameMappedToColors};
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public ColorAndKey[] BrushMap { get; set; }
}

public class ColorAndKey
{
    public string Key { get; set; }
    public Brush Brush { get; set; }
}

public class ServerNameObject : BaseObservableObject
{
    public ObservableCollection<ServerNameParts> ServerNamePartsCollection { get; set; }
}

public class ServerNameParts : BaseObservableObject
{
    private string _name;
    private Brush _namePartBrush;


    public Brush NamePartBrush
    {
        get { return _namePartBrush; }
        set
        {
            _namePartBrush = value;
            OnPropertyChanged();
        }
    }

    public string NamePart
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged();
        }
    }
}

5. BaseObservableObject 是 INotifyPropertyChanged 接口的簡單實現。

public class BaseObservableObject : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    protected virtual void OnPropertyChanged<T>(Expression<Func<T>> raiser)
    {
        var propName = ((MemberExpression)raiser.Body).Member.Name;
        OnPropertyChanged(propName);
    }

    protected bool Set<T>(ref T field, T value, [CallerMemberName] string name = null)
    {
        if (!EqualityComparer<T>.Default.Equals(field, value))
        {
            field = value;
            OnPropertyChanged(name);
            return true;
        }
        return false;
    }
}

該解決方案由轉換器提供,該轉換器將字符串轉換為我們可以在 xaml 中模板化的對象。 我希望它會幫助你。 問候,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM