Стилизировать гиперссылку и TextBlock одним стилем? - PullRequest
3 голосов
/ 12 февраля 2010

У меня есть два типа текста, которые должны следовать похожим правилам раскраски на основе перечисления:

 public enum Modes
 {
   A,
   B,
   C
 }

Стиль с разметкой DataTrigger используется для раскрашивания:

      <Style TargetType="SEE BELOW" x:Key="Coloring">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=.}" Value="A">
                    <Setter Property="Foreground" Value="Red" />
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=.}" Value="B">
                    <Setter Property="Foreground" Value="Green" />
                </DataTrigger>
               <DataTrigger Binding="{Binding Path=.}" Value="C">
                    <Setter Property="Foreground" Value="Blue" />
                </DataTrigger>
            </Style.Triggers>
        </Style>

Один сценарий использования - System.Windows.Documents.Hyperlink с вложенным System.Windows.Controls.TextBlock:

<Hyperlink><TextBlock/></Hyperlink>

а другой - просто TextBlock:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>

Конечно, я могу стилизовать оба элемента TextBlock:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink><TextBlock Style="{StaticResource Coloring}"/></Hyperlink>

, но это не соответствует стилю подчеркивания в случае гиперссылки.

Если я попытаюсь стилизовать оба типа:

<TextBlock Style="{StaticResource Coloring}" Text="yada"/>
<Hyperlink Style="{StaticResource Coloring}"><TextBlock/></Hyperlink>

Затем стилирование завершается неудачно, поскольку (по-видимому) нет общего типа предка для использования в атрибуте TargetType стиля.

Поскольку предполагается, что это в конечном итоге конфигурируемая вещь, цель состоит в том, чтобы получить документ XAML, который определяет режим отображения цветов для этих текстовых блоков. Поэтому я не хочу иметь два избыточных стиля (один для гиперссылки и один для TextBlock), которые определяют одно и то же отображение.

Итак ... вопрос: Как можно последовательно стилизовать оба случая без избыточных блоков стиля XAML?

Ответы [ 2 ]

6 голосов
/ 12 февраля 2010

Вы можете заставить Гиперссылки иметь тот же цвет переднего плана, что и их родительские TextBlocks, связав их внутри самого стиля, например так:

<Style TargetType="TextBlock" x:Key="Coloring">
        <Style.Resources>
            <Style TargetType="Hyperlink">
                <Setter Property="Foreground" Value="{Binding Foreground,RelativeSource={RelativeSource FindAncestor,AncestorType=TextBlock}}"/>
            </Style>
        </Style.Resources>
            <Setter Property="Foreground" Value="Orange"/>
        <Style.Triggers>
        <DataTrigger Binding="{Binding Path=.}" Value="A">
            <Setter Property="Foreground" Value="Red" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=.}" Value="B">
            <Setter Property="Foreground" Value="Green" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=.}" Value="C">
            <Setter Property="Foreground" Value="Blue" />
        </DataTrigger>
    </Style.Triggers>
</Style>

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

0 голосов
/ 12 февраля 2010

После публикации я понял другой подход. Я заставлял Гиперссылку с вложенным сценарием TextBlock. Если бы я обернул гиперссылку в TextBlock:

<TextBlock Style="{StaticResource Coloring}"><Hyperlink><TextBlock/></HyperLink></TextBlock>

Тогда оба моих случая рушатся до стиля TextBlock. (В сочетании с решением выше)

...