首页 > 解决方案 > XAML 样式中是否有像 CSS 中那样的元素选择器?

问题描述

在 CSS 中,您可以这样做:

#menu, #nav-bar, #data-grid {
    background: autumn-red;
}

XAML 样式中是否有类似的东西?

标签: csswpfxamlcss-selectorswpf-controls

解决方案


这是我能想到的最接近的 - 虽然它不是“选择器”,但它仍然允许您为多个元素实例定义一次样式:

假设您的 Menu、ToolBar 和 DataGrid WPF 组件都有一个公共的基本类型,该基本类型是或继承自 Control,您可以在容器的资源中定义具有特定 x:Key 的单个样式,例如 CommonStyle,并将 TargetType 设置为公共组件祖先类型。

例如,该样式可以具有用于背景的 Setter,和/或前景,或 Control 的 FontSize 属性。

然后,您可以使用 Style="{StaticResource CommonStyle}" 从每个实例中指向该样式。

需要注意的是,某些类型实现(实际上是它们的 ControlTemplates)根本不使用在公共祖先类型上定义的属性值。例如,DataGrid 不考虑行的背景(但对于行之间的小分隔符和行下的区域,如果空间较大 - 将 Height="200" 添加到其实例以查看),工具栏不'不使用 Foreground,但所有 DataGrid、Menu 和 ToolBar 都使用 FontSize。

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <Style x:Key="CommonStyle" TargetType="Control">
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="FontSize" Value="30"/>
        </Style>
    </Window.Resources>
    <StackPanel>
        <Menu Style="{StaticResource CommonStyle}">
            <MenuItem Header="Test"/>
        </Menu>
        <ToolBar Style="{StaticResource CommonStyle}">
            <Button Content="Test"/>
        </ToolBar>
        <DataGrid Style="{StaticResource CommonStyle}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding}" Header="Item"/>
            </DataGrid.Columns>
            <sys:String>Test</sys:String>
        </DataGrid>
    </StackPanel>
</Window>

截屏

我希望它有所帮助。


推荐阅读