Когда Вы устанавливаете непрозрачность на a Grid
в WPF все дочерние элементы, кажется, наследовали Opacity
. Как у Вас может быть дочерний элемент не, наследовали непрозрачность родителя?
Например, следующая родительская сетка имеет одну дочернюю сетку в середине с фоновым набором к красному, но фон кажется розоватым из-за непрозрачности родителя. Я хотел бы, чтобы дочерняя сетка имела сплошной цвет, непрозрачный фон:
<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>
Мне удалось добиться чего-то подобного в чистом xaml, используя кисть для рисования фона основной сетки. Таким образом, только родительская сетка будет имеют установленную непрозрачность, и его дочерние элементы не наследуют его.
<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 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 -->
Если вы хотите, чтобы все дочерние элементы родительского контейнера устанавливали свою непрозрачность независимо от родителей, вы можете просто установить альфа-канал фона родительской панели ( вместо установки непрозрачности), чтобы получить слегка прозрачный фон, не затрагивая дочерние элементы. Примерно так, где 0C на заднем плане - это альфа-канал (AA в AARRGGBB):
<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 и некоторых хитрых приемов с альфа-каналами или маской непрозрачности. В противном случае вы могли бы создать какой-то настраиваемый элемент управления, который дал бы вам желаемое поведение. Мне пришлось бы немного подумать, чтобы увидеть, что может быть лучшим решением для такого типа сценария.