Вопрос [WPF] Как добавить placeholder на textbox?

Пользователь
Статус
Оффлайн
Регистрация
25 Июл 2018
Сообщения
150
Реакции[?]
48
Поинты[?]
0
placeholder - исчезающий текст при нажатии на textbox
1630944308417.png

пытался сделать сам, гуглил и перепробовал 100500 решений - ничего не работает
(хотя уверен это занимает несколько строчек кода)
 
Эксперт
Статус
Оффлайн
Регистрация
14 Ноя 2020
Сообщения
1,799
Реакции[?]
586
Поинты[?]
2K
placeholder - исчезающий текст при нажатии на textbox
Посмотреть вложение 170645

пытался сделать сам, гуглил и перепробовал 100500 решений - ничего не работает
(хотя уверен это занимает несколько строчек кода)
Можно сделать как овощ, Если появилась возможность написать что-либо в текстбоксе то не рендерить текст который должен исчезать(ну и конечно добавить плавную анимацию).
Можно сделать как овощ, Если появилась возможность написать что-либо в текстбоксе то не рендерить текст который должен исчезать(ну и конечно добавить плавную анимацию).
По идее делается в пару строк.
 
Пользователь
Статус
Оффлайн
Регистрация
25 Июл 2018
Сообщения
150
Реакции[?]
48
Поинты[?]
0
на самом деле это делается как то так

XML:
        <TextBox x:Name="name" ></TextBox>
        <TextBlock Text="URL"">
            <TextBlock.Style>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Visibility" Value="Collapsed"></Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Text, ElementName = name}" Value="">
                            <Setter Property="Visibility" Value="Visible"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
 
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,826
Реакции[?]
1,853
Поинты[?]
24K
Есть два варианта реализации поставленной Вами задачи. Первый - программный рендеринг текста и его последующая замена при событиях фокуса, как предлагает dermagister:
C#:
public void RemoveText(object sender, EventArgs e)
{
    TextBox instance = (TextBox)sender;
    if (instance.Text == instance.Tag.ToString())
        instance.Text = "";
}

public void AddText(object sender, EventArgs e)
{
    TextBox instance = (TextBox)sender;
    if (string.IsNullOrWhiteSpace(instance.Text))
        instance.Text = instance.Tag.ToString();
}
XAML TextBox'а:
XML:
<TextBox HorizontalAlignment="Left" Height="23" Margin="44,22,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" GotFocus="RemoveText" LostFocus="AddText" Tag="Irval" Text="Irval"/>
Где Tag и Text будут являться Вашим placeholder'ом.
Второй - использование стилизации WPF. Добавьте следующий код в App.xaml -> Application.Resources:
XML:
<Style x:Key="placeHolder" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <TextBox Text="{Binding Path=Text,
                                                RelativeSource={RelativeSource TemplatedParent},
                                                Mode=TwoWay,
                                                UpdateSourceTrigger=PropertyChanged}"
                                 x:Name="textSource"
                                 Background="Transparent"
                                 Panel.ZIndex="2" />
                            <TextBox Text="{TemplateBinding Tag}" Background="{TemplateBinding Background}" Panel.ZIndex="1">
                                <TextBox.Style>
                                    <Style TargetType="{x:Type TextBox}">
                                        <Setter Property="Foreground" Value="Transparent"/>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding Path=Text, Source={x:Reference textSource}}" Value="">
                                                <Setter Property="Foreground" Value="LightGray"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBox.Style>
                            </TextBox>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
Использование:
XML:
<TextBox Style="{StaticResource placeHolder}" Tag="Irval" HorizontalAlignment="Left" Height="23" Margin="44,22,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
Где Tag является текстом Вашего placeholder'а.
Советую использовать второй вариант, из-за явно лучшей оптимизации, простоты кода и возможностью дальнейшей стилистической кастомизации.
 
Сверху Снизу