Как Вы переопределяете непрозрачность родительского управления в WPF?

Когда Вы устанавливаете непрозрачность на 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>
29
задан Metro Smurf 16 April 2010 в 04:17
поделиться

3 ответа

Мне удалось добиться чего-то подобного в чистом 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>
45
ответ дан 28 November 2019 в 01:38
поделиться

Вы можете просто наложить две сетки внутри сетки макета. Первый будет определен как ваша сетка за вычетом самой красной внутренней сетки. Второй будет определен с теми же столбцами и строками с прозрачным фоном. Единственным дочерним элементом этой сетки будет ваша самая внутренняя сетка.

    <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 -->
3
ответ дан 28 November 2019 в 01:38
поделиться

Если вы хотите, чтобы все дочерние элементы родительского контейнера устанавливали свою непрозрачность независимо от родителей, вы можете просто установить альфа-канал фона родительской панели ( вместо установки непрозрачности), чтобы получить слегка прозрачный фон, не затрагивая дочерние элементы. Примерно так, где 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 и некоторых хитрых приемов с альфа-каналами или маской непрозрачности. В противном случае вы могли бы создать какой-то настраиваемый элемент управления, который дал бы вам желаемое поведение. Мне пришлось бы немного подумать, чтобы увидеть, что может быть лучшим решением для такого типа сценария.

1
ответ дан 28 November 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: