2013-06-21 3 views
0

У меня есть точное название кисти (AliceBlue, OrangeRed и т. Д.), И мне интересно, можно ли выбрать эту кисть этой строкой. Brushes - статическая коллекция, и я действительно не знаю, как это сделать. Я думаю, что в обычной коллекции это можно сделать, выбрав свойство name элемента с Linq, но, похоже, здесь не работает.Выберите кисть по имени

ответ

8

Используйте BrushConverter из пространства имен System.ComponentModel:

BrushConverter conv = new BrushConverter(); 

Вы может использовать название цвета:

SolidColorBrush brush = conv.ConvertFromString("Red") as SolidColorBrush; 

Вы также можете использовать значение RGB:

SolidColorBrush brush = conv.ConvertFromString("#0000FF") as SolidColorBrush; 
+0

Спасибо, мне очень нравится ваше решение. – Sturm

2

Вы можете сделать это с отражением достаточно легко:

// 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)); 
0

От BrushConverter класса (MSDN):

Используйте этот класс, чтобы преобразовать строку в SolidColorBrush или ImageBrush. См. Эти страницы типов для получения информации о синтаксисе. Этот класс равен , который обычно используется анализатором для преобразования строк атрибутов в кисти.

SolidColorBrush redBrush = (SolidColorBrush)new BrushConverter().ConvertFromString("Red"); 

Вы можете создать свой собственный StringToBrushConverter и использовать выше кода в методе Convert, передавая цветовые переменные строки и возвращает SolidColorBrush переменные.

0

У меня есть два решения для вас.

одно использование свойства 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(); 
     } 
    }