Каскадные стили в WPF (а-ля CSS) - PullRequest
6 голосов
/ 03 ноября 2011

есть ли способ указать что-то подобное в WPF:

CSS:

#someSpan input { color: #f1f1f1; }
or
span input { color: #f1f1f1; }

Это означает, что я хотел бы, чтобы все элементы TextBlock в контейнере следовали стилю x, без необходимости применять стиль к каждому текстовому блоку.

просто чтобы уточнить, мне нужно сделать что-то подобное в WPF.

я знаю об атрибуте BasedOn стиля ... но это не совсем то, что я ищу здесь

ищет что-то вроде этого

 <Style x:Key="FileItem"  TargetType="{x:Type #SomeContainer TextBlock}">

или, возможно, в SomeContainer добавьте стиль TextBlock, который будет применяться ко всем его текстовым блокам

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

Вы можете сделать это, вам просто нужно вложить стили, например,

<Style TargetType="{x:Type Border}">
    <Style.Resources>
        <Style TargetType="{x:Type TextBox}">
            <!-- ... -->
        </Style>
    <Style.Resources>
</Style>

Это позволяет вам стилизовать TextBoxes в Borders, однако к элементам может быть применен только один стиль, поэтому параллельные «правила» также не будут работать.

4 голосов
/ 03 ноября 2011

Что касается последней части вашего вопроса, если вы хотите применить стиль ко всем TextBlock s в конкретном элементе, просто поместите Style в ресурсы этого элемента:

<TextBlock /> <!-- unaffected -->

<Grid>
    <Grid.Resources>
        <Style TargetType="TextBlock">
            <!-- ... -->
        </Style>
    </Grid.Resources>

    <TextBlock /> <!-- will be styled -->
</Grid>

Если ваши стили хранятся в отдельном ResourceDictionary, вы можете «импортировать» их все для определенного элемента, объединив словари ресурсов:

<Grid>
    <Grid.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Resources/MyOtherStyles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Grid.Resources>

    <TextBlock /> <!-- will be styled -->
</Grid>
...