2015-09-15 3 views
4

Я меняю цвет TextDecoration таким образом:Как изменить цвет TextDecoration в WPF TextBlock?

<Grid Background="{x:Null}" 
     Margin="10,0,10,0"> 
    <TextBlock Text="{Binding Value}" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       Style="{StaticResource SWMRegularTextBlockStyle}" 
       Margin="0" 
       FontSize="{DynamicResource RegularFontSize}" 
       x:Name="tb" /> 
     <Line VerticalAlignment="Center" 
       HorizontalAlignment="Center" 
       Visibility="{Binding InStock, Converter={StaticResource ReverseBooleanToVisiblity}}" 
       Stroke="Red" 
       Margin="0" 
       StrokeThickness="2" 
       X1="1" 
       Stretch="Fill" 
       Width="{Binding ActualWidth, ElementName=tb, UpdateSourceTrigger=PropertyChanged}" /> 
</Grid> 

Но когда Text имеет две строки, он выходит из строя. Пожалуйста, помогите мне изменить цвет TextDecoration. Спасибо заранее.

ПРИМЕЧАНИЕ: Я хочу TextBlock переднего плана и сквозной линии в разных цветах.

ответ

12

Я думаю, что это то, что вы ищете.

<TextBlock Text="{Binding Value}" VerticalAlignment="Center" HorizontalAlignment="Center" Style="{StaticResource SWMRegularTextBlockStyle}" Margin="0" FontSize="{DynamicResource RegularFontSize}" x:Name="tb" > 
    <TextBlock.TextDecorations> 
      <TextDecoration Location="Strikethrough"> 
       <TextDecoration.Pen> 
        <Pen Brush="Red" /> 
       </TextDecoration.Pen> 
      </TextDecoration> 
     </TextBlock.TextDecorations> 
    </TextBlock> 
</TextBlock > 
+0

Точно, что я только что искал. –

0

Проблема заключается в том, что вы накладываете текст на текст. Когда текст обертывается, вам нужно создать еще одну строку, которая не будет легкой.

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

Answer found here

private void WindowLoaded(object sender, EventArgs e) 
    { 
     // Fill the overline decoration with a solid color brush. 
     TextDecorationCollection myCollection = new TextDecorationCollection(); 
     TextDecoration myStrikeThrough = new TextDecoration(); 
     myStrikeThrough.Location = TextDecorationLocation.Strikethrough; 

     // Set the solid color brush. 
     myStrikeThrough.Pen = new Pen(Brushes.Red, 2); 
     myStrikeThrough.PenThicknessUnit = TextDecorationUnit.FontRecommended; 

     // Set the underline decoration to the text block. 
     myCollection.Add(myStrikeThrough); 
     tb.TextDecorations = myCollection; 
    } 

А затем упростить XAML. Удалите элемент управления Линии и добавьте Loaded="WindowLoaded" к вашему окну