2016-12-08 2 views
1

У меня есть два элемента TextBlock Run с разными цветами (один из них явно установлен на элементе). Я хочу, чтобы они оба меняли цвет на красный, когда значение Foo равно нулю, используя тот же стиль. Возможно ли это как-то? Я бы предпочел не дублировать стиль. Это то, что я хочу работать:Свойство переопределения WPF, указанное на элементе из триггера стиля

<Style x:Key="ForegroundStyleTrigger" TargetType="Run"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Foo}" Value="0"> 
      <Setter Property="Foreground" Value="{StaticResource RedBrush}"></Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 


<TextBlock> 
    <Run Text="{Binding Foo, Mode=OneWay}" 
     Style="{StaticResource ForegroundStyleTrigger}"/> 
    <Run Text="{Binding Bar, Mode=OneWay}" 
     Foreground="Blue" 
     Style="{StaticResource ForegroundStyleTrigger}"/> 
</TextBlock> 

Но так как локально определенный цвет (один определенные на элементе) имеет приоритет над триггерами типа, ничего не происходит, и текст остается голубым для этого текста перспективы.

Вопрос: Могу ли я переопределить цвет TextBlocks с ресурсом стиля? Если нет, как достичь ожидаемого результата без дублирования ресурса стиля?

ответ

2

Могу ли я переопределить TextBlocks запускает цвет из ресурса стиля?

Нет, вы не можете переопределить локальное значение с помощью установщика стиля.

Если нет, то как достичь ожидаемого результата без дублирования ресурса стиля?

Если вы хотите переднего план второго запуска элемента, чтобы быть синим по умолчанию и красным, только если источник Foo возвращается свойство «0» вы можете создать другой стиль и базы это один на уже существующем:

<Style x:Key="ForegroundStyleTrigger" TargetType="Run"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Foo}" Value="0"> 
       <Setter Property="Foreground" Value="Red"></Setter> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <Style x:Key="BlueByDefault" BasedOn="{StaticResource ForegroundStyleTrigger}" TargetType="Run"> 
     <Setter Property="Foreground" Value="Blue" /> 
    </Style> 


    <TextBlock> 
     <Run Text="{Binding Foo, Mode=OneWay}" Style="{StaticResource ForegroundStyleTrigger}"/> 
     <Run Text="{Binding Bar, Mode=OneWay}" Style="{StaticResource BlueByDefault}"/> 
    </TextBlock> 

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

1

Вы должны использовать наследование Style для достижения того, что вы просите. Хитрость то, что все свойства должны быть в Style как локальные явно заданные значения переопределяют неявно устанавливается Style значения:

<Style x:Key="ForegroundStyleTrigger" TargetType="Run"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Foo}" Value="0"> 
      <Setter Property="Foreground" Value="{StaticResource RedBrush}"></Setter> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<Style x:Key="BlueForegroundStyleTrigger" BasedOn="{StaticResource ForegroundStyleTrigger}" TargetType="Run"> 
    <Setter Property="Foreground" Value="Blue"/> 
</Style> 


<TextBlock> 
    <Run Text="{Binding Foo, Mode=OneWay}" 
     Style="{StaticResource ForegroundStyleTrigger}"/> 
    <Run Text="{Binding Bar, Mode=OneWay}" 
     Style="{StaticResource BlueForegroundStyleTrigger}"/> 
</TextBlock> 
+0

Это также правильный ответ, я просто потратил 10 минут на решение, какой из них следует пометить как правильно. Другой был для меня чуть более ясным. в любом случае, спасибо! – micnil

+1

Спасибо. Тем не менее я бы посоветовал вам привыкнуть к правильным техническим терминам, а не к необузданному языку - имея в виду уровень организаций, в которых прежде всего используется WPF, вам будут заданы вопросы, используя эту точную терминологию при проведении интервью с ними. – toadflakz

Смежные вопросы