Используйте один и тот же стиль для текстового блока и элемента запуска

#.net #wpf #styles

#.net #wpf #стили

Вопрос:

У меня есть стиль WPF, для которого задается TextDecorations свойство dependency TargetType: TexBlock . Мне нужно использовать тот же стиль для определенных элементов запуска, которые находятся в некотором текстовом блоке, который сам по себе не использует вышеупомянутый стиль. Как я могу добиться этого, не повторяя тот же стиль с другим TargetType ?

Ответ №1:

Просто не указывайте TargetType , а уточняйте свойство, например:

 <Style x:Key="CommonStyle">
    <Setter Property="Inline.TextDecorations" Value="StrikeThrough" />
</Style>
  
 <TextBlock Style="{StaticResource CommonStyle}" Text="Lorem Ipsum" />
<TextBlock>
    <Run Style="{StaticResource CommonStyle}" Text="Lorem" />
    <Run Text="Ipsum" />
</TextBlock>
  

Если вы хотите продолжить разработку стиля, который вы можете использовать BasedOn , это также позволяет неявно применять указанный стиль, не устанавливая ключ для производного стиля.

Комментарии:

1. Вау. Я попробовал то же самое, но я установил Property="TextDecorations" вместо Property="Inline.TextDecorations" , и получил ошибку «FrameworkElement не содержит …». Добавление «встроенного». действительно работает.

2. Меня интересует базовый механизм, который позволяет это, не могли бы вы, пожалуйста, пролить свет или некоторые ссылки?

3. @H.B. — есть ли способ обнаружить это, не отражая код? Указано ли где-нибудь в MSDN, что TextBlock.TextDecorations «похищает» Inline.TextDecorations ?

4. @BorisB.: 1. Если вы не используете префикс, он будет искать свойство on FrameworkElement , потому что этому классу принадлежит Style свойство. 2. Run наследует свойство от Inline и TextBlock повторно использует свойство с помощью AddOwner . Если вы видите два одинаковых свойства в несвязанных типах, всегда стоит проверить, использует ли одно свойство другого. Для этого удобны декомпиляторы (например, ILSpy ). Проверьте статические конструкторы классов на предмет инициализации свойств.

5. @Erno: Я так не думаю, я всегда использую для этого декомпилятор, посмотрел на MSDN, но они, к сожалению, не делятся этой информацией.