如何在WPF中覆盖父控件的不透明度?
在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
网格
的不透明度时,所有子元素都会继承其不透明度
。如何使子元素不继承父元素的不透明度
<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,谢谢。这种方法是一种很好的替代首席回答的方法。