Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Я новичек, не стукайте
7 / 7 / 3
Регистрация: 05.05.2022
Сообщений: 274
WPF

Почти готовый placeholder для textbox

12.05.2023, 14:53. Показов 2651. Ответов 30

Студворк — интернет-сервис помощи студентам
Написал placeholder для текстбокса, но не понимаю как сделать доп параметры для того что бы указывать расположение placeholder по типу VerticalAlignment и HorizontalAlignment
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<Style x:Key="TextBoxWithPlaceholder" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Border x:Name="Border" 
                       BorderThickness="1"
                       CornerRadius="2"
                       Background="{TemplateBinding Background}"
                       BorderBrush="{TemplateBinding BorderBrush}"/>
                            <TextBlock x:Name="Placeholder"
                          Text="{TemplateBinding Tag}"
                          Foreground="Gray"
                          Margin="5,0,0,0"
                          VerticalAlignment="{Binding RelativeSource={RelativeSource AncestorType={x:Type TextBox}}, Path=TagVerticalAlignment}"
                          IsHitTestVisible="False"
                          Visibility="Collapsed"/>
                            <ScrollViewer x:Name="PART_ContentHost" Margin="5,0,0,0" VerticalAlignment="{Binding RelativeSource={RelativeSource AncestorType={x:Type TextBox}}, Path=TagVerticalContentAlignment}" />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Text" Value=""/>
                                    <Condition Property="IsFocused" Value="False"/>
                                </MultiTrigger.Conditions>
                                <Setter TargetName="Placeholder" Property="Visibility" Value="Visible"/>
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2023, 14:53
Ответы с готовыми решениями:

Не работает в PasswordBox реализация Watermark (Placeholder, Водяной знак, текст подсказки) для TextBox
Добрый день. Когда у меня был вот такой XAML: &lt;Grid Margin=&quot;0,20,0,0&quot;&gt; &lt;Grid.Resources&gt; ...

Placeholder в TextBox
Привет! Реализовал Placeholder и не могу додуматься каким образом менять его текст для разных &quot;текстбоксов&quot;. Ну т.е. в окне...

Почти готовый скрипт
есть скрипт, но не могу сделать так, чтобы база обновлялась, в чем косяк, подскажите, вот скрипт (база во время скрипта открыта): ...

30
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
22.05.2023, 10:58
Студворк — интернет-сервис помощи студентам
Budka3000, с таким исправлением работает?

Добавлено через 1 минуту
Для текста тоже можете создать такое дополнительное AP-свойство и использовать его.
Это гораздо лучше чем делать через Tag.
0
Я новичек, не стукайте
7 / 7 / 3
Регистрация: 05.05.2022
Сообщений: 274
22.05.2023, 11:30  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Правильно:
Рано обрадовался, после первого запуска и редактирования стиля, перестал работать - без ошибок, но текст просто не ввести
Перезалил на гит
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
22.05.2023, 12:18
Цитата Сообщение от Budka3000 Посмотреть сообщение
после первого запуска и редактирования стиля, перестал работать - без ошибок, но текст просто не ввести
Токо вечером смогу посмотреть.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
22.05.2023, 22:45
Цитата Сообщение от Budka3000 Посмотреть сообщение
перестал работать - без ошибок, но текст просто не ввести
У меня вроде всё ок работает:
0
Я новичек, не стукайте
7 / 7 / 3
Регистрация: 05.05.2022
Сообщений: 274
23.05.2023, 11:36  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня вроде всё ок работает:
А текст то вводится?
То что сами плейсхолдеры есть, это то понятно

Добавлено через 29 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня вроде всё ок работает:
Немного потестил, все вводит, проблема в другом, текст невидимый просто, через ctrl+a все выделяет и можно скопировать
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.05.2023, 13:28
Цитата Сообщение от Budka3000 Посмотреть сообщение
А текст то вводится?
То что сами плейсхолдеры есть, это то понятно
Не пробовал. Я не понял первоначального вопроса.
Вечером проверю, если ещё не решили.

Добавлено через 2 минуты
Budka3000, так у вас же в Шаблоне TextBox нет элемента для ввода текста!

Добавлено через 1 минуту
Место для ввода текста в шаблоне указывается элементом <ScrollViewer x:Name="PART_ContentHost" />

Добавлено через 2 минуты
В шаблоне в топе темы он у вас есть, а в коде на GitHub его нет.
0
Я новичек, не стукайте
7 / 7 / 3
Регистрация: 05.05.2022
Сообщений: 274
23.05.2023, 14:24  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Место для ввода текста в шаблоне указывается элементом <ScrollViewer x:Name="PART_ContentHost" />
А, спасибо, видимо случайно как-то удалил

Добавлено через 49 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В шаблоне в топе темы он у вас есть, а в коде на GitHub его нет.
Решил его немного доработать и добавить триггер на валидацию, так что бы при ее срабатывании border в красный красился, но не срабатывает и не могу понять почему
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<Style x:Key="TextBoxWithPlaceholder" TargetType="{x:Type TextBox}">
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="CaretBrush" Value="Black"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="FontSize" Value="13"/>
            <Setter Property="FontWeight" Value="Light"/>
            <Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <Border BorderThickness="0"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Opacity" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Border x:Name="Border"
                            BorderThickness="0.5"
                            CornerRadius="5"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            >
                                <Border.Style>
                                    <Style TargetType="Border">
                                        <Style.Triggers>
                                            <Trigger Property="Validation.HasError" Value="True">
                                                <Setter Property="BorderBrush" Value="Red"/>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </Border.Style>
                            </Border>
                            <TextBlock x:Name="Placeholder"
                               Text="{TemplateBinding Tag}"
                               Foreground="#A0A0A0"
                               Margin="3"
                               IsHitTestVisible="False"
                               Visibility="Collapsed"
                               Style="{TemplateBinding att:Helper.AdditionalStyle}"/>
                            <ScrollViewer x:Name="PART_ContentHost" Margin="3" VerticalAlignment="{Binding RelativeSource={RelativeSource AncestorType={x:Type TextBox}}, Path=TagVerticalContentAlignment}" />
                        </Grid>
                        <ControlTemplate.Triggers>
                            <MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="Text" Value=""/>
                                    <Condition Property="IsFocused" Value="False"/>
                                </MultiTrigger.Conditions>
                                <Setter TargetName="Placeholder" Property="Visibility" Value="Visible"/>
                            </MultiTrigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
23.05.2023, 16:36
В шаблоне в топе темы он у вас есть, а в коде на GitHub его нет.
Цитата Сообщение от Budka3000 Посмотреть сообщение
но не срабатывает и не могу понять почему
Триггер нужно добавлять в ControlTemplate.Triggers. Ошибка валидации же у родительского TextBox, а не у дочернего Border.

Добавлено через 2 минуты
И визуализацию валидации нужно задавать через Validation.ErrorTemplate.
По умолчанию просто красная рамка и так у него уже есть.
0
Я новичек, не стукайте
7 / 7 / 3
Регистрация: 05.05.2022
Сообщений: 274
24.05.2023, 11:49  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
По умолчанию просто красная рамка и так у него уже есть.
Та что по умолчанию я убрал, ибо она просто элемент обводит, а этого мне не надо

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ошибка валидации же у родительского TextBox, а не у дочернего Border.
Так то да, просто покрасится должен как-раз Border, в стандартном стиле я без проблем это сделал и все шикарно работало, а тут уже немного без идей
И там как раз через ControlTemplate.Triggers сделано
Выглядит это так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
    <SolidColorBrush x:Key="TextBox.Static.Border1" Color="#FFABAdB3"/>
    <SolidColorBrush x:Key="TextBox.MouseOver.Border1" Color="#FF7EB4EA"/>
    <SolidColorBrush x:Key="TextBox.Focus.Border1" Color="#FF569DE5"/>
    <Style x:Key="TextEnter" TargetType="{x:Type TextBox}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="#A0A0A0"/>
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="BorderThickness" Value="0.5"/>
        <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="VerticalAlignment" Value="Top"/>
        <Setter Property="FontSize" Value="12"/>
        <Setter Property="Padding" Value="4,0,4,0"/>
        <Setter Property="CaretBrush" Value="Black"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <Border BorderThickness="0"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border x:Name="border" CornerRadius="5" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
                        <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.MouseOver.Border1}"/>
                        </Trigger>
                        <Trigger Property="IsKeyboardFocused" Value="true">
                            <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.Focus.Border1}"/>
                        </Trigger>
                        <Trigger Property="Validation.HasError" Value="True">
                            <Setter Property="BorderBrush" TargetName="border" Value="Red"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsInactiveSelectionHighlightEnabled" Value="true"/>
                    <Condition Property="IsSelectionActive" Value="false"/>
                </MultiTrigger.Conditions>
                <Setter Property="SelectionBrush" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
            </MultiTrigger>
        </Style.Triggers>
    </Style>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16165 / 11285 / 2891
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 2
24.05.2023, 12:18
Цитата Сообщение от Budka3000 Посмотреть сообщение
Так то да, просто покрасится должен как-раз Border,
Значит задайте в сеттере TargetName.
Сути это не меняет - нужны триггеры ControlTemplate.Triggers, а не стиля Бордера.

Цитата Сообщение от Budka3000 Посмотреть сообщение
Та что по умолчанию я убрал, ибо она просто элемент обводит, а этого мне не надо
Вам нужно изменить этот шаблон так как вам нужно, а не удалять его.

Добавлено через 1 минуту
Цитата Сообщение от Budka3000 Посмотреть сообщение
Выглядит это так
Надо в Студии смотреть.
Не могу сейчас. Может вечером получится, но не обещаю.
0
Я новичек, не стукайте
7 / 7 / 3
Регистрация: 05.05.2022
Сообщений: 274
24.05.2023, 14:51  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вам нужно изменить этот шаблон так как вам нужно, а не удалять его.
Решил сейчас так и сделать, и выяснил занимательный факт, если изменить любой параметр оно просто исчезнет
XML
1
2
3
4
5
6
7
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <Border BorderThickness="0"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
т.е. я менял толщину на 5, и обводки просто не было, как и например cornerradius выставить любое значение, то обводки не будет
А если убрать код выше то обводка появиться

Добавлено через 1 час 47 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо в Студии смотреть.
вроде сделал
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<Style x:Key="TextBoxWithPlaceholder" TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="CaretBrush" Value="Black"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="FontSize" Value="13"/>
        <Setter Property="FontWeight" Value="Light"/>
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <DockPanel LastChildFill="True">
                        <AdornedElementPlaceholder/>
                        <TextBlock Foreground="Red" Margin="2,0,0,0"/>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Border x:Name="Border"
                            BorderThickness="0.5"
                            CornerRadius="5"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"/>
                        <TextBlock x:Name="Placeholder"
                               Text="{TemplateBinding Tag}"
                               Foreground="#A0A0A0"
                               Margin="3"
                               IsHitTestVisible="False"
                               Visibility="Collapsed"
                               Style="{TemplateBinding att:Helper.AdditionalStyle}"/>
                        <ScrollViewer x:Name="PART_ContentHost" Margin="3"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="Text" Value=""/>
                                <Condition Property="IsFocused" Value="False"/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="Placeholder" Property="Visibility" Value="Visible"/>
                        </MultiTrigger>
                        <Trigger Property="Validation.HasError" Value="True">
                            <Setter TargetName="Border" Property="BorderBrush" Value="Red"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.05.2023, 14:51

filterRangeInPlace почти готовый
Доброго времени суток, написал код и столкнулся з данной проблемой если брать диапазон чисел от 10 то перестает работать код подскажите...

Частотный словарь (почти готовый)
Доброй ночи. Помогите пожалуйста закончить программку. Задание: разработать приложение, позволяющее строить частотный словарь для...

Продаю почти готовый проект
Здравствуйте, продаю пушечный проект. 2д игра головоломка! Движение есть, музыка есть, графон есть. Бери и играй. Осталось только допелить...

Внедрить части кода в почти готовый финальный проект
Здравствуйте, я делаю проект в делфи и никак не могу внедрить часть кода туда:cry: Вот задание: Пусть дана прямоугольная матрица А(N x...

Почти готовый морской бой (нужна критика кода)
Морской бой 1. код разделён на два пакета logic и swing 2. правильно ли я манипулирую данными: получаю, передаю, изменяю. ? 3. не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru