2013-11-07 5 views
0

В настоящее время я создаю TextBox с текстом с водяными знаками и немного проблем с дизайном. Чтобы создать водяной знак, я включил здесь код, приведенный здесь Watermark/hint text/placeholder TextBox in WPF Я не использовал принятый ответ, но тот, который имеет самые высокие голоса. (Один с помощью Adorner)Watermark fontsize/family

Моего TextBlock выглядит следующим образом:

<AdornerDecorator> 
    <TextBox HorizontalAlignment="Right" 
       VerticalAlignment="Center" 
       Width="190" 
       Padding="16,2,20,2"> 
     <utils:WatermarkService.Watermark> 
      <TextBlock Text="Search" /> 
     </utils:WatermarkService.Watermark> 
    </TextBox> 
</AdornerDecorator> 

Теперь я сталкиваюсь с проблемой, что с этой прикрепленной собственностью, TextBlock в нем выходит из сферы от моего стиля я объявленный в приложении .xaml. Моделирование выглядит следующим образом:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="FontFamily" 
      Value="Tahoma" /> 
    <Setter Property="FontSize" 
      Value="8pt"></Setter> 
    <Setter Property="Background" 
      Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" /> 
</Style> 

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

ответ

1

Declare same style for TextBlock также in Application resources. Таким образом, он будет применяться ко всем текстовым блокам в вашем приложении независимо от того, являются ли они частью Adorners или window.

<Style TargetType="{x:Type TextBlock}"> 
    <Setter Property="FontFamily" 
      Value="Tahoma" /> 
    <Setter Property="FontSize" 
      Value="8pt"></Setter> 
    <Setter Property="Background" 
     Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}"/> 
</Style> 

UPDATE

Если вы не хотите, чтобы дублировать ресурсы, лучшее, что вы можете получить это использовать Label вместо TextBlock. Таким образом, вы можете применить стиль на Control и можете получить стили для Window и Label.

Но это не будет работать для TextBlock, так как оно не происходит от Control.

<Style TargetType="Control" x:Key="BaseStyle"> 
     <Setter Property="FontFamily" Value="Tahoma" /> 
     <Setter Property="FontSize" Value="8pt"></Setter> 
     <Setter Property="Background" 
     Value="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}"/> 
    </Style> 

    <Style TargetType="{x:Type Window}" 
      BasedOn="{StaticResource BaseStyle}"/> 
    <Style TargetType="{x:Type Label}" 
      BasedOn="{StaticResource BaseStyle}"/> 

Затем, если вы используете этикетки внутри AdornerDecorator вместо TextBlock, он будет работать нормально.

+0

Спасибо за ответ. Не существует ли более простой способ указать fontsize/fontfamily, которые использовали по умолчанию для всего текста. Я как бы надеялся, что это с моим стилем, но это не похоже на это. И мне не нравится идея указать тот же стиль два раза не могу я использовал atleast стиль на основе в моем случае? –

+0

Для функции BasedOn targetType должен быть одинаковым для обоих стилей. Но в одном случае у вас есть Window, а другое - TextBlock. –

+0

Так что это невозможно без дублирования стилей? –