[英]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.