2015-02-10 2 views
-1

Свойства переднего плана и фона имеют тип кисти. Как получить цвет для дальнейшего использования в Color Picker?Как получить цвета переднего плана и фона для текстового поля для дальнейшего использования в Color Picker?

проходит передний план и фон в с-тором окна свойств, как это:

private void Menu_Properties_OnClick(object sender, RoutedEventArgs e) 
{ 
    PropertiesDialog propDialog = new PropertiesDialog(TbTimer.Foreground, TimerPanel.Background); 
    if (propDialog.ShowDialog() == true) 
    { 
     //set color to TbTimer textbox and TimerPanel WrapPanel 
    } 
} 

TbTimer является TextBox, TimerPanel является WrapPanel.

Это окно свойств с-тор:

public PropertiesDialog(Brush foreground, Brush background) 
{ 
    InitializeComponent(); 

    FontColorPicker.SelectedColor = foreground; //Compilation error 
    BgColorPicker.SelectedColor = background; //Compilation error 
} 

Здесь я получаю Cannot implicitly convert type 'System.Windows.Media.Brush' to 'System.Windows.Media.Color'.

Как получить цвет кистей?

+0

Этот вопрос не имеет смысла, что так всегда, то, что текстовое поле получил делать с ним? – BenjaminPaul

+0

Содержимое текстового поля, например, переднего плана и фона, настраивается пользователем. – Dragon

ответ

1

При установке Background свойства элемента в XAML-то вроде «Red», преобразователь типа преобразует строку «Красный» в SolidColorBrush объект, Color свойство устанавливается в соответствующий цвет.

Так что:

<TextBlock Background="Red" /> 

эквивалентно следующему:

<TextBlock> 
    <TextBlock.Background> 
     <SolidColorBrush Color="Red" /> 
    </TextBlock.Background> 
</TextBlock> 

SolidColorBrush единственный тип кисти, который имеет один "цвет". Другие типы кистей могут иметь более одного цвета или вообще не могут представлять «цвет» (например, DrawingBrush или VisualBrush).

Если вы хотите, чтобы конструктор вашего диалогового окна принимал объекты Brush как параметры, но также хотел иметь дело с ними как с одиночными цветами, тогда вам нужно будет нарисовать их как объекты SolidColorBrush в соответствии с ответом @ BenjaminPaul. Разумеется, тип кисти может быть разным, поэтому явное сбрасывание завершится с исключением.

Лучшее, что вы можете сделать что-то вроде этого:

public PropertiesDialog(Brush foreground, Brush background) 
{ 
    InitializeComponent(); 

    var solidForeground = foreground as SolidColorBrush; 
    var solidBackground = background as SolidColorBrush; 

    if (solidForeground == null || solidBackground == null) 
    { 
     // One or both of the brushes does not have a 
     // single solid colour; what you do here is up to you 
     throw new InvalidOperationException(); 
    } 

    FontColorPicker.SelectedColor = solidForeground.Color; 
    BgColorPicker.SelectedColor = solidBackground.Color; 
} 
+0

О, я понял. Спасибо за подробный ответ. – Dragon

0

Simpy изменить ваш метод подписи:

public PropertiesDialog(System.Windows.Media.Color foreground, System.Windows.Media.Color background) 
{ 
    InitializeComponent(); 

    FontColorPicker.SelectedColor = foreground; 
    BgColorPicker.SelectedColor = background; 
} 
+0

Я обновил тему с более подробной информацией. – Dragon

0

SelectedColour ожидает тип System.Windows.Media.Color однако вы пытаетесь присвоить кисть ... попробуйте литья следующим образом.

public PropertiesDialog(Brush foreground, Brush background) 
{ 
    InitializeComponent(); 

    FontColorPicker.SelectedColor = ((SolidColorBrush)foreground).Color; 
    BgColorPicker.SelectedColor = ((SolidColorBrush)background).Color; 
}