如何在WPF中覆盖父控件的不透明度?

如何在WPF中覆盖父控件的不透明度?,wpf,transparency,opacity,Wpf,Transparency,Opacity,在WPF中设置网格的不透明度时,所有子元素都会继承其不透明度。如何使子元素不继承父元素的不透明度 <Grid Grid.Column="0" Grid.Row="1" Background="Red" Opacity="1" /> <Grid Grid.Column="1" Grid.Row="1" Background="Green" /> <Grid Grid.Column="2" Gr

在WPF中设置
网格
的不透明度时,所有子元素都会继承其
不透明度
。如何使子元素不继承父元素的不透明度

<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />

例如,下面的父网格在中间有一个子网格,背景设置为红色,但是背景由于父的不透明度而呈现粉红色。我希望子网格具有纯色、不透明的背景:

<Grid x:Name="LayoutRoot">

  <Grid Background="Black" Opacity="0.5">
    <Grid.RowDefinitions>
      <RowDefinition Height="0.333*"/>
      <RowDefinition Height="0.333*"/>
      <RowDefinition Height="0.333*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="0.333*"/>
      <ColumnDefinition Width="0.333*"/>
      <ColumnDefinition Width="0.333*"/>
    </Grid.ColumnDefinitions>

    <-- how do you make this child grid's background solid red
        and not inherit the Opacity/Transparency of the parent grid? -->
    <Grid Grid.Column="1" Grid.Row="1" Background="Red"/>
  </Grid>

</Grid>
<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />


如果希望父容器的所有子容器都设置自己的不透明度,而不考虑父容器,则可以只设置父面板背景的alpha通道(而不是设置不透明度),以获得稍微透明的背景,而不影响子元素。类似这样,背景中的0C是Alpha通道(AARGGBB中的AA):

<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />

<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />

<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />

但是,如果您希望除一个之外的所有子对象都遵守父对象的不透明性,这就有点复杂了。您可以使用ControlTemplate和Alpha通道或不透明遮罩的一些巧妙技巧来实现这一点。如果没有,您可以构建某种自定义控件,为您提供所需的行为。我必须考虑一下,看看对于这种情况,什么可能是最好的解决方案。

我能够在纯xaml中使用画笔绘制主网格背景来实现类似的效果。
<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />
这样,只有父网格将设置其不透明度,而其子元素将不会继承它

<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />
<Grid x:Name="LayoutRoot">       
      <Grid>
        <Grid.Background>
            <SolidColorBrush Color="Black" Opacity="0.5"/>
        </Grid.Background>
        <Grid.RowDefinitions>
          <RowDefinition Height="0.333*"/>
          <RowDefinition Height="0.333*"/>
          <RowDefinition Height="0.333*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="0.333*"/>
          <ColumnDefinition Width="0.333*"/>
          <ColumnDefinition Width="0.333*"/>
        </Grid.ColumnDefinitions>

        <Grid Grid.Column="1" Grid.Row="1" Background="Red" />
      </Grid>   
</Grid>

您可以在布局网格中叠加两个网格。第一个将被定义为网格,减去最里面的红色网格。第二个将使用相同的列和行定义,并具有透明的背景。此网格的唯一子网格将是最内层的网格

<Grid Grid.Column="0"
      Grid.Row="1"
      Background="Red"
      Opacity="1" />

<Grid Grid.Column="1"
      Grid.Row="1"
      Background="Green" />

<Grid Grid.Column="2"
      Grid.Row="1"
      Background="Blue" />
    <Grid x:Name="LayoutRootNew" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch">

        <Grid Background="Black" Opacity="0.5">
            <Grid.RowDefinitions>
                <RowDefinition Height="0.333*"/>
                <RowDefinition Height="0.333*"/>
                <RowDefinition Height="0.333*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.333*"/>
                <ColumnDefinition Width="0.333*"/>
                <ColumnDefinition Width="0.333*"/>
            </Grid.ColumnDefinitions>

            <TextBlock Grid.Column="0" Grid.Row="0">
                 Here is some content in a somewhat transparent cell  
            </TextBlock>

        </Grid> <!-- End of First Grid -->

        <!-- Second grid -->
        <Grid Background="Transparent">
            <Grid.RowDefinitions>
                <RowDefinition Height="0.333*"/>
                <RowDefinition Height="0.333*"/>
                <RowDefinition Height="0.333*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="0.333*"/>
                <ColumnDefinition Width="0.333*"/>
                <ColumnDefinition Width="0.333*"/>
            </Grid.ColumnDefinitions>

            <Grid Grid.Column="1" Grid.Row="1" Background="Red">
                <TextBlock Foreground="White" Text="Here Is Your Red Child" />
            </Grid> <!-- Inner Child Grid -->
        </Grid> <!-- End of Second Grid -->
    </Grid>     <!-- Layout Grid -->

下面是一个透明单元格中的一些内容

目的是让除一个之外的所有子项都遵守父项的不透明度。也许有些东西可以在原生xaml中设置,而无需构建自定义控件?谢谢主任。纯色画笔成功了!欢迎来到StackOverflow(551;)/您是否有到实现此功能的站点的链接?我正在尝试覆盖纯html/css3中的不透明度,并且非常希望看到这种方法产生的html。太棒了!遗憾的是,VS没有一种内置的方式来区分是否继承父级不透明度。这适用于多个网格,我已经实现了这项技术,以获得具有正常不透明度内容的半透明TabControl。@Wonko,谢谢。这种方法是一种很好的替代首席回答的方法。