Переопределить типизированный стиль текстового блока для contentpresenter в WPF - PullRequest
2 голосов
/ 21 марта 2011

Я определил стиль Textblock, который набирается (в отличие от значения ключа), чтобы он применялся ко всем текстовым блокам.

<Style TargetType="{x:Type TextBlock}">
        <Setter Property="FontFamily" Value="MyFancyFont"/>
        <Setter Property="FontSize" Value="13.333" />
        <Setter Property="Foreground" Value="Gray" />
</Style>

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

<!--part of the treeviewitem template-->
<Trigger Property="IsSelected" Value="true">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Background" Value="Black"/>
</Trigger>

Определение локального стиля для текстового блока не работает для ситуации, когда выбран элемент древовидной структуры, поскольку текстовый блок в элементе все еще выбирает типизированный стиль.

Есть ли хороший способ сделать это, сохранив стиль текстового блока как "Типизированный"?

1 Ответ

3 голосов
/ 21 марта 2011

этот вопрос может вам помочь. Он показывает, как переопределить неявный стиль.

Хорошо, я понимаю вашу проблему, и у меня нет прямого решения, но в любом случае я расскажу вам, как я справляюсь с такими вещами:

Вы знаете, что неявные стили ограничены, что означает:

    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type TextBlock}">
                <Setter Property="FontFamily" Value="MyFancyFont"/>
            </Style>
        </Grid.Resources>
        <TextBlock>textblock with MyFancyFont</TextBlock>           
    </Grid>
    <TextBlock>textblock with normal font</TextBlock>

Я обычно стараюсь избегать такого неявного стиля для TextBlock в ресурсах моего главного окна. Вместо этого я мог бы сделать:

<Application bunch="ofStuff">
    <Application.Resources>
        <Style TargetType="{x:Type TextBlock}" x:Key="TextBlockStandardStyle">
            <Setter Property="FontFamily" Value="MyFancyFont"/>
        </Style>
    </Application.Resources>
</Application>

затем в подрайонах, где этот стиль может быть неявным и не причинять никакого вреда, я напишу:

    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextBlockStandardStyle}"/>              
        </Grid.Resources>
        <TextBlock>textblock with MyFancyFont</TextBlock>           
    </Grid>

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

...