在我的 C# / WPF / .NET 4.5 应用中,我想实现一个切换背景不透明度的Trigger
控制而不改变颜色。
通常要设置控件的背景画笔,我会使用以下Setter
:
<Setter TargetName="TargetControl" Property="Background">
<Setter.Value>
<SolidColorBrush Color="Red" Opacity="0.2"/>
</Setter.Value>
现在我处的情况是我只需改变不透明度而不是颜色。在这种情况下,我的二传手会是什么样子,我不在乎背景是什么颜色,但是我想在改变不透明度的同时保留颜色?
这样做的原因是我正在使用ItemsControl
,其中背景颜色会根据项目AlternationIndex
而变化:
<ItemsControl ItemsSource="{Binding SomeCollection}" AlternationCount="6">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid x:Name="GridWithin">
<!-- ... -->
</Grid>
<DataTemplate.Triggers>
<!-- Aternating colors for each row -->
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter TargetName="GridWithin" Property="Background">
<Setter.Value>
<SolidColorBrush Color="Red" Opacity="0.2"/>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter TargetName="AllGesturesDataTemplateGrid" Property="Background">
<Setter.Value>
<SolidColorBrush Color="Green" Opacity="0.2"/>
</Setter.Value>
</Setter>
</Trigger>
<!-- ... -->
<!-- Highlight when a hit is registered -->
<DataTrigger>
<DataTrigger.Conditions>
<Condition Binding="{Binding IsHit}" Value="True" />
</MultiDataTrigger.Conditions>
<!-- The culprit -->
<Setter TargetName="GridWithin" Property="Background">
<Setter.Value>
<SolidColorBrush Opacity="0.7"/>
</Setter.Value>
</Setter>
<!-- /culprit -->
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 0 :(得分:4)
我花了一点时间想到最好的方法......事实证明它比我原先想象的要复杂。尽管如此,它是可能的,但它确实涉及相当多的代码。为了能够定位Opacity
对象的实际Background Brush
属性,您需要使用StoryBoard
...这就是为什么这个代码示例如此冗长。
因为我们需要在Storyboard
中使用DataTrigger
对象,这意味着我们必须使用DataTrigger.EnterActions
因为Storyboard
无法在正常DataTrigger.Setters
中使用DataTrigger.ExitActions
1}}集合。接下来,我们还必须使用Storyboard
提供另一个Opacity
,将<Grid Name="YourGrid">
<Grid.Background>
<SolidColorBrush Color="Green" Opacity="0.2" />
</Grid.Background>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, ElementName=YourGrid}"
Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="Background.(SolidColorBrush.Opacity)">
<LinearDoubleKeyFrame Value="0.7" KeyTime="0:0:0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="Background.(SolidColorBrush.Opacity)">
<LinearDoubleKeyFrame Value="0.2" KeyTime="0:0:0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
属性设置回其原始值。试试这个:
Rectangle
尽管实现此方法需要大量代码,但它确实完全符合您的要求。但是,有一种更简单的方法可以获得相同的整体效果,但代码略少。您可以只需在每个Grid
单元格或分区的后面添加Rectangle.Opacity
,然后在其上设置颜色和不透明度。使用此方法,您可以直接设置{{1}}值,尽管您将使用额外的控件......您可以选择。
答案 1 :(得分:0)
这个答案与@Sheridans几乎完全相同,但它节省了几行XAML(而且总是太多了......)
Grid Name="YourGrid">
<Grid.Background>
<SolidColorBrush Color="Green" Opacity="0.2" />
</Grid.Background>
<Grid.Style>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, ElementName=YourGrid}"
Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard Storyboard.TargetProperty="Background.(SolidColorBrush.Opacity)">
<DoubleAnimation To="0.7" Duration="0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard Storyboard.TargetProperty="Background.(SolidColorBrush.Opacity)">
<DoubleAnimation To="0.2" Duration="0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
答案 2 :(得分:-1)
“网格”具有自己的“不透明度”属性以及“背景”属性。或许可以使用触发器来改变不透明度并单独留下背景颜色?