осветлить цвет фона при нажатии кнопки для привязки с конвертером

Я хочу осветлить фон кнопки при нажатии. Итак, я сделал следующее:


...

            
        
            
                
                                                
                        
                            
                                
                                    
                                
                            
                        
                    
                    
                        ...                            
                    
                
            
        
    

Конвертер:

class ColorLightConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Color color = (Color)value;
            System.Drawing.Color lightColor = ControlPaint.Light(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B));

            return Color.FromArgb(lightColor.A, lightColor.R, lightColor.G, lightColor.B);
        }

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

Но конвертер неТ звонил, когда я нажимал кнопку. Я думаю, что с переплетом что-то не так, но я могуне вижу ошибки ...

Вы можете мне помочь?

Может я'Я совершенно не прав. Что я в основном хочу сделать: при нажатии кнопки выберите текущий цвет фона и осветлите его. Не больше...

Обновление 1:

Я попробовал следующее:

Немного изменил привязку:


                            
                        

Изменен конвертер (теперь он возвращает SolidColorBrush):

class ColorLightConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Color color = (Color)value;
            System.Drawing.Color lightColor = ControlPaint.Light(System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B));

            return new SolidColorBrush(Color.FromArgb(lightColor.A, lightColor.R, lightColor.G, lightColor.B));
        }

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

Теперь вызывается конвертер, но он вызывается снова и снова, поэтому через несколько секунд выдается исключение stackoverflow. Откуда этот неопределенный цикл? Я'я действительно немного запутался в данный момент ...

 tklepzig30 окт. 2012 г., 11:18
Большое спасибо HighCore, Mode = OneTime сделали свое дело! Хотите добавить это решение в дополнительный ответ?
 Federico Berasategui29 окт. 2012 г., 23:25
Бесконечный цикл исходит из того, что выповторное связывание с Background.Color, а затем установка фона, который вызывает уведомление об изменении свойства в системе свойств WPF, что, в свою очередь, приводит к обновлению привязки и т. д. Я думаю, что вы могли бы обойти это установив режим привязки = OneTime.

Ответы на вопрос(3)

  <style targettype="{x:Type Button}">
    <!-- General for all buttons -->
    <Setter Property="Foreground"
            Value="Azure" />
    <Setter Property="FontFamily"
            Value="Verdana" />
    <Setter Property="FontSize"
            Value="12" />
    <Setter Property="FontWeight"
            Value="Bold" />
    <Setter Property="Margin"
            Value="4,4,4,4"></Setter>
    <Setter Property="VerticalAlignment"
            Value="Center"></Setter>
    <Setter Property="Background">
        <Setter.Value>
            <RadialGradientBrush>
                <GradientStop Color="#145082"
                              Offset="0" />
                <GradientStop Color="Black"
                              Offset="1" />
            </RadialGradientBrush>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid>
                    <Rectangle x:Name="GelBackground"
                               Opacity="1"
                               RadiusX="9"
                               RadiusY="9"
                               Fill="{TemplateBinding Background}"></Rectangle>
                    <Rectangle x:Name="GelShine"
                               Margin="2,2,2,0"
                               VerticalAlignment="Top"
                               RadiusX="4"
                               RadiusY="4"
                               Opacity=".8"
                               Stroke="Transparent"
                               Height="15">
                        <Rectangle.Fill>
                            <LinearGradientBrush StartPoint="0,0"
                                                 EndPoint="0,1">
                                <GradientStop Color="#ccffffff"
                                              Offset="0" />
                                <GradientStop Color="Transparent"
                                              Offset="1" />
                            </LinearGradientBrush>
                        </Rectangle.Fill>
                    </Rectangle>
                    <ContentPresenter Margin="10,0,10,0"
                                      VerticalAlignment="Center"
                                      HorizontalAlignment="Center" />
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver"
                             Value="true">
                        <Setter Property="Foreground"
                                Value="White" />
                        <Setter Property="FontSize"
                                Value="12" />
                        <Setter Property="Rectangle.Fill"
                                TargetName="GelBackground">
                            <Setter.Value>
                                <RadialGradientBrush>
                                    <GradientBrush.GradientStops>
                                        <GradientStopCollection>
                                            <GradientStop Color="Tomato"
                                                          Offset="0" />
                                            <GradientStop Color="Black"
                                                          Offset="1" />
                                        </GradientStopCollection>
                                    </GradientBrush.GradientStops>
                                </RadialGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="IsPressed"
                             Value="true">
                        <Setter Property="Foreground"
                                Value="Black" />
                        <Setter Property="Fill"
                                TargetName="GelBackground">
                            <Setter.Value>
                                <RadialGradientBrush>
                                    <GradientStop Color="#ffcc00"
                                                  Offset="0" />
                                    <GradientStop Color="#cc9900"
                                                  Offset="1" />
                                </RadialGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="IsEnabled"
                             Value="false">
                        <Setter Property="Foreground"
                                Value="Black" />
                        <Setter Property="Fill"
                                TargetName="GelBackground">
                            <Setter.Value>
                                <RadialGradientBrush>
                                    <GradientStop Color="White"
                                                  Offset="0" />
                                    <GradientStop Color="#333333"
                                                  Offset=".4" />
                                    <GradientStop Color="#111111"
                                                  Offset=".6" />
                                    <GradientStop Color="#000000"
                                                  Offset=".7" />
                                    <GradientStop Color="#000000"
                                                  Offset="1" />
                                </RadialGradientBrush>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</style>
Решение Вопроса

льзуйте System.Windows.Media.Color. Еще одним важным моментом является то, что сеттеры внутри ControlTemplate.Triggers не должны ссылаться на элемент управления с помощью RelativeSource TemplatedParent. Просто:

<trigger property="IsPressed" value="True">
    <setter property="Background" value="YourLightColor">
</setter></trigger>

И остальное оставь прежним. Теперь, если вам нужно указать собственную логику (например, конвертер, просто поместите конвертер в этот установщик).

Редактировать: бесконечный цикл происходит из-за того, что выповторное связывание с Background.Color, а затем установка фона, который вызывает уведомление об изменении свойства в системе свойств WPF, что, в свою очередь, приводит к обновлению привязки и т. д. Я думаю, что вы могли бы обойти это установив режим привязки = OneTime

 tklepzig29 окт. 2012 г., 22:49
что ты имеешь в виду под "просто поместите конвертер в этот сеттер "? Как бы это выглядело с конвертером?

я неЯ не знаю точно, почему из всех свойств фон всегда действует таким образом, но если вы установите шаблон вместо фона, проблема будет решена:

    <style targettype="{x:Type controls:Button}">
        <Style.Triggers>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type controls:Button}">
                            <Border>
                                <Border.Background>
                                    <SolidColorBrush Color="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                                        Path=Background.Color, Converter={StaticResource colorLightConverter}}"/>
                                </Border.Background>
                                <ContentPresenter Content="{TemplateBinding Content}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Setter Property="Template">
        <Setter.Value.../>
    </Setter>
    </style>

Ваш ответ на вопрос