2011-05-08 92 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