XAML可在不改变颜色的情况下更改背景不透明度

时间:2014-06-04 12:49:55

标签: c# wpf xaml

在我的 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>

3 个答案:

答案 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)

“网格”具有自己的“不透明度”属性以及“背景”属性。或许可以使用触发器来改变不透明度并单独留下背景颜色?