Как добавить сообщение «введите здесь» в WPF TextBox? - PullRequest
3 голосов
/ 22 сентября 2009

Если текстовое поле не имеет фокуса клавиатуры и текста, тогда выделите курсив серым цветом «введите здесь» текст «внутри» него. Как? Что не работает:

  • Установка свойства Text - портит привязку данных.
  • Переопределение шаблона - оно в любом случае уже грязное и переопределено.

Желательно, чтобы решением было как можно больше XAML и как можно меньше C #. Возможно, я мог бы создать прикрепленное свойство, которое могло бы творить чудеса?

Ответы [ 5 ]

4 голосов
/ 22 сентября 2009

То, что вы ищете, известно как Водяной знак . Я не знаком с WPF, но поиск WPF & Watermark в "Google" возвращает массу результатов.

1 голос
/ 01 мая 2014

Создайте стиль для вашего TextBox. Это один из самых простых способов добавить «водяной знак» в ваш TextBox. Код создает простой стиль и привязывает его к TextBox.

(Код извлечен из: http://social.msdn.microsoft.com/Forums/vstudio/en-US/d565c79e-6b4a-44e2-a566-a4a622eab22f/how-to-set-watermark-for-textbox-in-simple-way?forum=wpf)

<Window.Resources>
    <Style x:Key="MyWaterMarkStyle" TargetType="{x:Type TextBox}">           
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Border Background="White" BorderBrush="#FF7D8683" BorderThickness="1"/>
                        <ScrollViewer x:Name="PART_ContentHost" Margin="5,0,0,0" VerticalAlignment="Center" />
                        <Label Margin="5,0,0,0" x:Name="WaterMarkLabel" Content="{TemplateBinding Tag}" VerticalAlignment="Center"
                           Visibility="Collapsed" Foreground="Gray" FontFamily="Arial"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="Text" Value=""/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Visibility" TargetName="WaterMarkLabel" Value="Visible"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Foreground" Value="DimGray"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

...

<TextBox Style="{StaticResource MyWaterMarkStyle}" Height="25" Tag="Water mark"/>
1 голос
/ 22 сентября 2009

Лучшее решение, которое я видел до сих пор, это InfoTextBox из библиотеки Кевина WPF Bag-o-Tricks . Проверьте это.

0 голосов
/ 30 июня 2016

Я рекомендую вам использовать Syncfusion для WPF. Он содержит SfTextBoxExt, который поддерживает водяной знак и другие функции.

Смотрите здесь

0 голосов
/ 22 сентября 2009

Не самое чистое решение, но вы всегда можете добавить TextBlock с наложением TextBox и изменить его свойство Visible, когда TextBox получает или теряет фокус.

Гадкий взлом, но несколько новаторский? Получу ли я за это очки брауни? ; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...