Есть ли в стилях XAML селектор элементов, как в CSS? - PullRequest
0 голосов
/ 08 марта 2020

В CSS вы можете сделать это:

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

Есть ли что-то похожее в стилях XAML?

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Это самое близкое, о чем я могу подумать - хотя это и не «селектор», он все же позволяет вам определить стиль один раз для нескольких экземпляров элемента:

Предполагая, что ваши компоненты Menu, ToolBar и DataGrid WPF у всех есть общий базовый тип, который является или наследуется от Control, вы можете определить один Стиль с указанием c x: Key, например CommonStyle, в Ресурсах вашего контейнера, с TargetType, установленным для этого общего предка типа компонента.

Стиль может иметь, например, свойства Setter for Background и / или Foreground или FontSize элемента Control.

Затем вы можете указывать на этот стиль из каждого экземпляра, используя Style = "{StaticResource CommonStyle } ".

Предостережение заключается в том, что некоторые реализации типов (фактически их ControlTemplates) НЕ используют значения свойств, определенные для общего предкового типа вообще. Например, DataGrid не учитывает фон для строк (но для небольшого разделителя между ними и для области под строками, если пространство больше - добавьте Height = "200" в его экземпляр, чтобы увидеть), Панель инструментов не не использовать Foreground, но FontSize используется всеми DataGrid, Menu и ToolBar.

<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>

Screenshot

Надеюсь, это поможет.

0 голосов
/ 02 апреля 2020

Эквивалент селектора wpf является типом элемента управления, и стиль может быть нацелен только на один.

Для данного элемента управления может применяться только один стиль.

Стили могут быть унаследованы от базового стиля с использованием basedon .

Обычно стили в словарях ресурсов помещаются и объединяются там, где это необходимо - часто это app.xaml, поэтому стилизация используется во всем приложении.

Однако можно применить стилирование в ресурсах указанного c элемента управления или родителя. Например:

<Window.Resources>
    <Style x:Key="BaseStyle" TargetType="Control">
        <Setter Property="Background" Value="Red"/>
    </Style>
    <Style TargetType="DataGrid" BasedOn="{StaticResource BaseStyle}"/>
    <Style TargetType="Menu" BasedOn="{StaticResource BaseStyle}"/>
</Window.Resources>

Выбранный тип таргетинга должен иметь свойство, которое вы хотите установить sh. Это также применимо в тех случаях, когда вы наследуете с использованием basedon.

Нет "каскадного" стилей.

Есть несколько сложностей.

WPF применяет значение из стиль для свойства зависимости. У DP есть множество дополнительных функций, и одно из этих свойств - «Наследуется». Вы можете установить значение для родителя, и оно наследуется по визуальному дереву элементов управления. Вот как шрифт и текстовый текст, примененный к окну, распространяются вплоть до его потомков.

Таким образом наследуются только некоторые DP, но те, которые предлагают удобный способ применить значение к содержимому всего контейнера.

В целом, совершенно очевидно, что CSS более гибок в этом отношении.

Стоит отметить, что в wpf есть и другие механизмы, которые предлагают гибкость. Это выходит за рамки просто установки фона чего-либо, но я думаю, что у вашего вопроса просто есть фон для простоты.

WPF имеет:

Шаблоны данных - которые могут создавать настолько богатый, насколько вы можете себе представить, кусок пользовательского интерфейса когда представлен фрагмент данных определенного типа c.

Элементы управления пользователя (страницы и т. д. c) - которые инкапсулируют пользовательский интерфейс с возможностью повторного использования.

Триггеры, триггеры данных и визуальный менеджер состояний - который позволяет вам устанавливать или анимировать значения для свойств зависимостей условно.

Поскольку элементы управления WPF «не выглядят» и их шаблоны определены в xaml, вы можете делать некоторые довольно удивительные вещи. Подобно шаблону переключателя в качестве текстового блока и переключать его текст при нажатии. Некоторые последствия этого очень сильны. Некоторые противоречат интуиции. https://social.technet.microsoft.com/wiki/contents/articles/29866.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...