2011-05-08 93 views
3

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

回答

2

不透明度蒙版不是一个非常好的选项,因为它可以修改不透明度。此外,不透明遮罩可以是任何类型的画笔,它不一定是渐变。

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

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

(为什么它必须是代码,而不是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> 
+0

好的,你能告诉我一个例子,使一个红色的矩形变暗吗?这两种选择有什么区别?似乎添加一个矩形会更慢。它必须以代码形式存在,因为这些元素是无形地添加的。 – Cobold 2011-05-08 18:45:16

+0

@Cobold:动态添加项目通常并不意味着您需要在WPF中编写代码隐藏功能才能正确显示它们。 – 2011-05-08 18:49:02

+0

@ H.B。那么如何才能将矩形的填充更改为只在xaml中更深,如果您没有设置属性的话,那么该怎么办? – Cobold 2011-05-08 18:52:16

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绑定值参数。

+0

你可以在视觉基础上写“颜色输入=(颜色)值”吗? – Cobold 2011-05-08 18:59:29

+0

我发现如何写它。但它说:类'ChangeColorOpacityConverter'必须实现'接口'System.Windows.Data.IValueConverter'的函数转换(值作为对象,targetType作为类型,参数作为对象,文化作为Globalization.CultureInfo)作为对象'。 – Cobold 2011-05-08 19:12:27

+0

没关系,我解决了它:) – Cobold 2011-05-08 19:15:43