2013-09-13 7 views
1

У меня есть usercontrol, и я хочу изменить цвет фона с этого элемента управления динамически.Использование конвертора для изменения цвета фона usercontrol

Когда задано определенное перечисление в модели view, я хочу, чтобы цвет изменился, поэтому я использую конвертер для преобразования перечисления в SolidColorBrush.

Когда я устанавливаю этот конвертер в другой элемент управления, он работает нормально. Но когда я помещаю его в свойства usercontrol в верхней части файла xaml, он дает ошибку.

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
xmlns:ee="http://schemas.microsoft.com/expression/2010/effects" 
mc:Ignorable="d" 
xmlns:converters="clr-namespace:UserControlSolution.Converter" 
x:Class="UserControlSolution.UserControlButton" 
x:Name="UserControl" 
Height="50" 
VerticalAlignment="Top" 
Background="{Binding CallStatus, Converter={StaticResource CallStatusBackgroundConverter}}" 
Margin="2,0,0,5" 
> 

<UserControl.Resources> 
    <converters:CallStatusEnumToBackgroundColor x:Key="CallStatusBackgroundConverter"/> 
    <converters:StatusEnumToStatusResourceConverter x:Key="StatusIconConverter"/> 
    <BooleanToVisibilityConverter x:Key="BoolToVis" /> 

    <Style x:Key="SelectedStyle" TargetType="{x:Type WrapPanel}"> 
     <Setter Property="Background" Value="Transparent"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="true"> 
       <Setter Property="Background" Value="{Binding CallStatus, Converter={StaticResource CallStatusBackgroundConverter}}"/> 
       <Setter Property="Opacity" Value=".92"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" VerticalAlignment="Top" HorizontalAlignment="Stretch">   
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="30"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="50"/> 
    </Grid.ColumnDefinitions> 
</Grid> 

Мой конвертер просто преобразует перечисления в цвет

namespace UserControlSolution.Converter 
{ 
    [ValueConversion(typeof(CallEnum), typeof(SolidColorBrush))] 
    public class CallStatusEnumToBackgroundColor : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      switch ((CallEnum)value) 
      { 
       case CallEnum.Connected: 
        return (SolidColorBrush)Application.Current.Resources["Red"]; 
       case CallEnum.ConnectedIntern: 
        return (SolidColorBrush)Application.Current.Resources["Blue"]; 
       case CallEnum.Hold: 
        return (SolidColorBrush)Application.Current.Resources["Orange"]; 
       case CallEnum.Idle: 
        return (SolidColorBrush)Application.Current.Resources["DarkGrey"]; 
       case CallEnum.OffRing: 
        return (SolidColorBrush)Application.Current.Resources["Yellow"]; 
       default: 
        return null; 
      } 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      throw new NotSupportedException(); 
     } 
    } 
} 
+0

Какая ошибка? – Sheridan

+0

XamlParseException на фоне линии в xaml. –

+0

Что такое внутреннее 'Исключение' ??? – Sheridan

ответ

5

Положите это после Ресурсы и удалите привязку с User Control:

<UserControl.Background> 
    <SolidColorBrush Color="{Binding CallStatus, Converter={StaticResource CallStatusBackgroundConverter}}"/> 
</UserControl.Background> 
+0

Конвертер возвращает 'SolidColorBrush' не' Цвет' –

+0

Что мне нужно изменить, чтобы сделать эту работу с SolidColorBrush? –

+0

только то, о чем я думал. –

0

Независимо от того, что ошибка (это может быть даже это), я хотел бы указать на то, что вы действительно должен проверить свои типы ввода в любых Converter класс:

if (value == null || value.GetType() != typeof(YourRequiredType)) 
    return DependencyProperty.UnsetValue; 
Смежные вопросы