Как определить все элементы текстового блока одного цвета - PullRequest
8 голосов
/ 24 октября 2011

Мы используем глобальные определения стилей для большинства типов. Определяем тогда в файле app.xaml. При использовании TextBlock сложно определить цвет переднего плана, потому что он меняет все элементы управления, используя TextBlock (например, цвет содержимого Button). Как мы можем определить глобальный стиль, который будет действовать только при определенных видах использования TextBlock?

текущее проблемное использование:

<Style TargetType={x:Type TextBlock}>
  <Setter Property="Foreground" Value="Red"/>
</Style>

Ответы [ 3 ]

2 голосов
/ 24 октября 2011

Это потому, что ContentPresenter создает TextBlock для строкового содержимого, и поскольку этот TextBlock отсутствует в визуальном дереве, он будет искать ресурс уровня приложения. А если вы определите стиль для TextBlock на уровне приложения, он будет применен к этим TextBlock в ControlControls.

Обходной путь должен определить DataTemplate для System.String, где мы можем явно использовать TextBlock по умолчанию для отображения содержимого. Вы можете поместить этот DataTemplate в тот же словарь, в котором вы определили стиль TextBlock, так что этот DataTemplate будет применен к любому ContentPresenter, на который влияет ваш стиль.

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

<DataTemplate DataType="{x:Type system:String}">
  <TextBlock Text="{Binding}">
    <TextBlock.Resources>
      <Style TargetType="{x:Type TextBlock}"/>
    </TextBlock.Resources>
  </TextBlock>
</DataTemplate>

Объявите пространство имен в вашем xaml, если оно еще не указано -

xmlns:system="clr-namespace:System;assembly=mscorlib"

РЕДАКТИРОВАТЬ: Проверьте этот образец, где он работает ..

<Style TargetType="{x:Type TextBlock}">
   <Setter Property="Foreground" Value="Red"/>
</Style>

<DataTemplate DataType="{x:Type system:String}">
  <TextBlock Text="{Binding}">
     <TextBlock.Resources>
        <Style TargetType="{x:Type TextBlock}"/>
     </TextBlock.Resources>
  </TextBlock>
</DataTemplate>

<Style TargetType="{x:Type Button}">
  <Setter Property="Foreground" Value="Yellow"/>
</Style>

<Style TargetType="{x:Type Label}">
  <Setter Property="Foreground" Value="Blue"/>
</Style>
2 голосов
/ 24 октября 2011

Поскольку я не думаю, что есть способ различать «ваши» TextBlock s и те, которые являются частью других элементов управления, ваши параметры весьма ограничены.

  • Вы можете создать именованныеStyle и добавьте Style="{StaticResource coloredTextBlock}" или Foreground="{StaticResource textBlockColor}" ко всем TextBlock с.Это было бы довольно утомительно и не СУХОЙ.
  • Вы можете создать свой собственный тип, который наследует от TextBlock и стилизовать его.Это имеет некоторые недостатки вышеуказанного решения (вы должны помнить об этом).Но у него гораздо меньше повторений.
1 голос
/ 24 октября 2011

Просто введите ax: key в стиле, например:

<Style x:Key="stRedTextBlock" TargetType={x:Type TextBlock}>
        <Setter Property="Foreground" Value="Red"/>
</Style>

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

<TextBlock Name="textBlock1" Style="{StaticResource stRedTextBlock}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...