使元素颜色变暗

时间:2011-05-08 18:07:59

标签: wpf vb.net

我想在mouseEnter事件触发时更改元素的背景颜色。如何使背景颜色变暗?我以为我可以使用不透明蒙版,但它是渐变,但我需要它是坚固的。它也必须是可视化的基本代码,而不是xaml。 请帮帮我!

2 个答案:

答案 0 :(得分:2)

不透明蒙版不是一个很好的选择,因为它修改了不透明度。此外,opacitymask可以是任何类型的画笔,它不必是渐变。

您可以执行以下两项操作之一:操纵当前画笔或在控件顶部添加黑色矩形并更改矩形的不透明度。

如果你让我知道你喜欢什么,我可以写一些代码。

(为什么它必须是代码而不是xaml?)

修改

<Window x:Class="TestWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestWpfApplication"
        Title="MainWindow"
        Height="350"
        Width="525">

    <StackPanel>
        <Grid>
            <TextBox Background="Red"
                     FontSize="24" />
            <Rectangle x:Name="overlay"
                       Fill="Black"
                       IsHitTestVisible="False"
                       Opacity="0" />
            <Grid.Triggers>
                <EventTrigger RoutedEvent="MouseEnter">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation To="0.9"
                                             Duration="0:0:0.2"
                                             Storyboard.TargetName="overlay"
                                             Storyboard.TargetProperty="(Rectangle.Opacity)" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="MouseLeave">
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation To="0"
                                             Duration="0:0:0.2"
                                             Storyboard.TargetName="overlay"
                                             Storyboard.TargetProperty="(Rectangle.Opacity)" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Grid.Triggers>
        </Grid>
    </StackPanel>
</Window>

答案 1 :(得分:1)

我可能会使用ValueConverter。最近使用此转换器来改变不透明度:

public class ChangeColorOpacityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Color input = (Color)value;
        input.A = byte.Parse((string)parameter); //Changes alpha to ValueConverterParameter
        return input;
    }

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

您可以将其更改为使颜色变暗,例如将所有颜色通道分成两部分。


VC使用示例:

<Border>
    <Border.Resources>
        <vc:DarkenColorConverter x:Key="DarkenColorConverter"/>
    </Border.Resources>
    <Border.Background>
        <SolidColorBrush Color="{Binding MyColor, Converter={StaticResource DarkenColorConverter}}"/>
    </Border.Background>
</Border>

如果您使用参数,则需要将绑定中的值指定为ConverterParameter