Размер/семейство водяных знаков

В настоящее время я создаю TextBox с текстом водяного знака и имею небольшую проблему со стилем. Чтобы создать сам водяной знак, я включил код, описанный здесь в WPF я использовал не принятый ответ, а тот, который получил наибольшее количество голосов. (тот, который использует Adorner)

Мой текстовый блок выглядит так:

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

Теперь я столкнулся с проблемой, что с этим прикрепленным свойством текстовый блок в нем выходит за рамки моего стиля, который я объявил в app.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>

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


person Rand Random    schedule 07.11.2013    source источник


Ответы (1)


Declare same style for TextBlock, а также in Application resources. Таким образом, он будет применяться ко всем TextBlocks в вашем приложении, независимо от того, являются ли они частью 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>

ОБНОВЛЕНИЕ

Если вы не хотите дублировать ресурсы, лучше всего использовать 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}"/>

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

person Rohit Vats    schedule 07.11.2013
comment
Спасибо за ответ. Нет ли более простого способа указать размер шрифта / семейство шрифтов, которое используется по умолчанию для всего текста. Я как бы надеялся, что это с моим стилем, но это не похоже на случай. И мне не нравится идея указывать один и тот же стиль дважды, не могу ли я использовать хотя бы стиль на основе в моем случае? - person Rand Random; 08.11.2013
comment
Для работы на основе типа targetType должен быть одинаковым для обоих стилей. Но в одном случае у вас есть Window, а в другом — TextBlock. - person Rohit Vats; 08.11.2013
comment
Значит, это невозможно без дублирования стилей? - person Rand Random; 08.11.2013
comment
Обновлен другим подходом, в котором вы можете использовать Label вместо TextBlock, где вам не нужно дублировать стили. - person Rohit Vats; 08.11.2013