Цвет текста кнопки переопределения стиля TextBlock по умолчанию - PullRequest
4 голосов
/ 21 декабря 2010

Моя проблема возникает с WPF в .NET 3.5 SP1 и может быть описана следующим образом:

У меня есть значение по умолчанию Style, поражающее все элементы TextBlock в моем пользовательском интерфейсе. Вот как это выглядит:

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

Это прекрасно работает для всех TextBlock с. В дополнение к этому у меня есть стиль Button, включая ControlTemplate, который выглядит следующим образом (сокращенно):

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}" BasedOn="{x:Null}">
   <Setter Property="Foreground" Value="Green"/>
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type Button}">
            <Border x:Name="Border" 
                    Background="{TemplateBinding Background}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="{TemplateBinding Padding}" 
                    Height="24" 
                    BorderBrush="{TemplateBinding BorderBrush}">
               <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                 VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                 TextBlock.Foreground="{TemplateBinding Foreground}"/>
            </Border>
            <ControlTemplate.Triggers>...</ControlTemplate.Triggers>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

Обратите внимание на строку TextBlock.Foreground="{TemplateBinding Foreground}" в ContentPresenter. Это должно установить текст кнопки зеленым, и фактически это происходит в представлении конструктора Visual Studio. Но когда я компилирую и запускаю программу, текст кнопки красный, цвет текста устанавливается по умолчанию в стиле TextBlock. Я проверял это с помощью Snoop.

Как предотвратить стиль TextBlock по умолчанию для переопределения значения TextBlock.Foreground? Свойство OverridesDefaultStyle ContentPresenter в этом случае не помогает.

Есть идеи?

Ответы [ 2 ]

10 голосов
/ 21 декабря 2010

См. Ответ 5 на этой ссылке

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

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

Попробуйте добавить его в ResourceDictionary

<DataTemplate DataType="{x:Type sys:String}">
    <TextBlock Text="{Binding}">
        <TextBlock.Resources> 
            <Style TargetType="{x:Type TextBlock}"/>
        </TextBlock.Resources>
    </TextBlock>
</DataTemplate>
4 голосов
/ 28 октября 2014

Вам лучше не переопределять стиль по умолчанию для TextBlock.Наилучшая идея, которую я мог придумать, - это создать стиль для Control и применить его ко всем окнам верхнего уровня.

<!-- App.xaml -->
<Application.Resources>
    <Style x:Key="RedStyle" TargetType="{x:Type Control}">
        <Setter Property="TextTrimming" Value="CharacterEllipsis"/>
        <Setter Property="Foreground" Value="Red"/>
    </Style>
</Application.Resources>

<!-- MainWindow.xaml -->
<Window Style="{StaticResource RedStyle}" ...>
    ...
</Window>

Подробнее см. Здесь: http://www.ikriv.com/dev/dotnet/wpftextstyle/

...