У меня есть точное название кисти (AliceBlue
, OrangeRed
и т. Д.), И мне интересно, можно ли выбрать эту кисть этой строкой. Brushes
- статическая коллекция, и я действительно не знаю, как это сделать. Я думаю, что в обычной коллекции это можно сделать, выбрав свойство name
элемента с Linq
, но, похоже, здесь не работает.Выберите кисть по имени
ответ
Используйте BrushConverter из пространства имен System.ComponentModel:
BrushConverter conv = new BrushConverter();
Вы может использовать название цвета:
SolidColorBrush brush = conv.ConvertFromString("Red") as SolidColorBrush;
Вы также можете использовать значение RGB:
SolidColorBrush brush = conv.ConvertFromString("#0000FF") as SolidColorBrush;
Вы можете сделать это с отражением достаточно легко:
// TODO: Validation :)
Brush brush = (Brush) typeof(Brushes).GetProperty(name)
.GetValue(null);
В качестве альтернативы, вы можете использовать отражение раз для заполнения словаря:
Dictionary<string, Brush> =
typeof(Brushes).GetProperties(BindingFlags.Public |
BindingFlags.Static)
.ToDictionary(p => p.Name,
p => (Brush) p.GetValue(null));
От BrushConverter
класса (MSDN):
Используйте этот класс, чтобы преобразовать строку в SolidColorBrush или ImageBrush. См. Эти страницы типов для получения информации о синтаксисе. Этот класс равен , который обычно используется анализатором для преобразования строк атрибутов в кисти.
SolidColorBrush redBrush = (SolidColorBrush)new BrushConverter().ConvertFromString("Red");
Вы можете создать свой собственный StringToBrushConverter
и использовать выше кода в методе Convert
, передавая цветовые переменные строки и возвращает SolidColorBrush
переменные.
У меня есть два решения для вас.
одно использование свойства SolidColorBrush и установка его с вашим желанием, как показано ниже.
И другой вариант использования конвертировать с BrushConverter Класс.
<Window x:Class="WpfApplication1.DynamicSorting"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DynamicSorting" Height="329" Width="610">
<Window.Resources>
<local:StringToBrushConverter x:Key="texttobrush"/>
</Window.Resources>
<Grid Background="{Binding SelectedBrush,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="242*" />
<ColumnDefinition Width="346*" />
</Grid.ColumnDefinitions>
<ComboBox Height="35" SelectedItem="{Binding SelectedBrush,Mode=TwoWay}" ItemsSource="{Binding AllBrushes}" HorizontalAlignment="Left" Margin="25,32,0,0" x:Name="comboBox1" VerticalAlignment="Top" Width="143" />
</Grid>
</Window>
public partial class DynamicSorting : Window, INotifyPropertyChanged
{
public DynamicSorting()
{
InitializeComponent();
if (FilesList == null)
FilesList = new ObservableCollection<FileInfo>();
var files = new System.IO.DirectoryInfo("C:\\Windows\\System32\\").GetFiles();
foreach (var item in files)
{
FilesList.Add(item);
}
if (AllBrushes == null)
AllBrushes = new ObservableCollection<string>();
Type t = typeof(Brushes);
var props = t.GetProperties();
foreach (var item in props)
{
AllBrushes.Add(item.Name);
}
this.DataContext = this;
}
private SolidColorBrush _SelectedBrush;
public SolidColorBrush SelectedBrush
{
get { return _SelectedBrush; }
set
{
_SelectedBrush = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("SelectedBrush"));
}
}
public ObservableCollection<FileInfo> FilesList { get; set; }
public ObservableCollection<string> AllBrushes { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
}
public class StringToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
return Brushes.Transparent;
var colortext = value.ToString();
var BrushType = typeof(Brushes);
var brush = BrushType.GetProperty(colortext);
if (brush != null)
return brush;
return Brushes.Transparent;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Спасибо, мне очень нравится ваше решение. – Sturm