#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 ( >
).