Стиль для прямых дочерних элементов

#wpf #xaml #app.xaml

#wpf #xaml #app.xaml

Вопрос:

Учитывая этот пример XAML:

 <TabControl>
    <TabItem Header="Test">
        <Grid> <!-- outer grid that should receive the styles -->
            <Grid.RowDefinitions><!-- ... --></Grid.RowDefinitions>
            <Grid.ColumnDefinitions><!-- ... --></Grid.ColumnDefinitions>
            <Grid Grid.Row="1" Grid.Column="1">
                <!-- inner grid, should NOT receive the styles -->
            </Grid>
        </Grid>
    </TabItem>
</TabControl>
 

Как я могу стилизовать все прямые Grid дочерние элементы TabItem и никакие другие Grid глубже в иерархии?

Вот что я попробовал (я поместил это в the App.xml ):

 <Style TargetType="TabItem">
    <Style.Resources>
        <Style TargetType="Grid">
            <Setter Property="Margin" Value="10" />
        </Style>
    </Style.Resources>
</Style>
 

(Я знаю, что могу назначить определенные стили, используя Style={StaticResource ...} , но тогда мне пришлось бы применять их ко всем Grid по отдельности, что кажется большим количеством ненужного кода …)

Комментарии:

1. Другие языки стилей, такие как CSS, имеют эти типы селекторов, и они действительно полезны для создания чистого и организованного кода.

2. WPF не предоставляет такой функции, и никто ее не упускает.

3. @Clemens Данное приложение имеет десятки форм, и вам нужен единый стиль во всех из них. Каков был бы правильный способ сделать это?

4. Вы уже знаете это. Если стиль по умолчанию не подходит, задайте его явно. Помимо этого, существуют также DataTemplates и UserControls.

5. Похоже, мы приближаемся к реальным ответам … 🙂

Ответ №1:

Как я могу стилизовать все прямые Grid дочерние элементы TabItem и никакие другие Grid глубже в иерархии?

Путем явной установки Style свойства для всех внешних Grid элементов так или иначе.

Вы могли бы, например, создать пользовательский Grid тип, к которому вы применяете Style :

 public class OuterGrid : Grid { }
 

XAML:

 <Style TargetType="local:OuterGrid">
    <Setter Property="Margin" Value="10" />
</Style>
...
<local:OuterGrid>
    <!-- outer grid that should receive the styles -->
    <Grid Grid.Row="1" Grid.Column="1">
        <!-- inner grid, should NOT receive the styles -->
        <TextBlock>inner</TextBlock>
    </Grid>
</local:OuterGrid>
 

Или укажите значения по умолчанию для пользовательского Grid параметра без использования Style :

 public class OuterGrid : Grid
{
    public OuterGrid()
    {
        Margin = new Thickness(10);
    }
}
 

Я боюсь, что в XAML нет понятия дочерних селекторов CSS ( > ).