Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444

Изменение видимости кнопки при наведении на элемент списка

13.10.2018, 13:24. Показов 3161. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть список, элементы в котором это stackpanel с textblock и кнопкой. Когда наводишь на элемент списка, кнопка должна появляться, но на моей памяти (через триггер) у меня ни разу такое провернуть и не получалось. Элементы списка определены через DataTemplate:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<ListBox>
                <ListBox.ItemTemplate>
                        <DataTemplate>
                                <!-- код триггера (который не работает и не подразумевает это)
                        <DataTemplate.Triggers>
                            <Trigger Property="StackPanel.IsMouseOver" Value="True">
                                <Setter Property="Свойства кнопки Visibility" Value="Visible"></Setter>
                            </Trigger>
                        </DataTemplate.Triggers> -->
                                <StackPanel Orientation="Horizontal">
                                        <TextBlock>Some</TextBlock>
                                        <Button Content="Удалить"
                                                Visibility="Hidden"></Button>
                                </StackPanel>
                        </DataTemplate>
                </ListBox.ItemTemplate>
                <ListBox.ItemsSource>
                        <system:String>12345</system:String><!-- кол-во символов определит кол-во показываемых элементов-->
                </ListBox.ItemsSource>
        </ListBox>
Готовая папка солюшена для теста:
TestProject.zip
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.10.2018, 13:24
Ответы с готовыми решениями:

Изменение видимости слоя при наведении мыши
Здравствуйте. Не ругатейтесь громко т.к. я нуб :stop: Дело в том что хочу реализовать такую штуку. Есть два слоя на одном анимация...

Изменение кнопки при наведении.
Добрый день. Помогите с кодом, чтобы при наведении мышки на кнопку, изображение кнопки &quot;1.gif&quot; , менялось на изображение кнопки...

Изменение кнопки при наведении
Здравствуйте! В WPF я недавно и прошу помочь. Нужно сделать кнопку в виде, например, смайлика. При наведении он менял улыбку. Кнопка должна...

9
Эксперт .NET
 Аватар для novikov.ea
1855 / 1361 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
14.10.2018, 10:07
XML
1
2
3
4
5
6
7
8
9
10
11
<StackPanel Orientation="Horizontal">
    <DataTemplate.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Visibility" TargetName="RemoveButton" Value="Visible" />
        </Trigger>
    </DataTemplate.Triggers>
    <TextBlock>Some</TextBlock>
    <Button x:Name="RemoveButton"
            Content="Удалить"
            Visibility="Hidden"></Button>
</StackPanel>
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
14.10.2018, 11:22
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
        <ListBox x:Name="listBox">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <!-- код триггера (который не работает и не подразумевает это)
                        <DataTemplate.Triggers>
                            <Trigger Property="StackPanel.IsMouseOver" Value="True">
                                <Setter Property="Свойства кнопки Visibility" Value="Visible"></Setter>
                            </Trigger>
                        </DataTemplate.Triggers> -->
                    <StackPanel Orientation="Horizontal">
                        <TextBlock>Some</TextBlock>
                        <Button Content="Удалить">
                            <Button.Style>
                                <Style TargetType="Button">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsMouseOver, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}}" Value="true">
                                            <Setter Property="Visibility" Value="Visible"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding IsMouseOver, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StackPanel}}}" Value="false">
                                            <Setter Property="Visibility" Value="Hidden"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Button.Style>
                        </Button>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemsSource>
                <sys:String>12345</sys:String>
                <!-- кол-во символов определит кол-во показываемых элементов-->
            </ListBox.ItemsSource>
        </ListBox>
Добавлено через 4 минуты
Но лучше StackPanel заменить на Grid. Иначе возможна ситуация когда строка ListBox больше вложенной StackPanel и, следовательно, появится участок строки выходящий за границы StackPanel и поведение на нём будет иным.

Добавлено через 12 минут
novikov.ea, Ваш вариант почему-то запустить мне не удалось. На второй строке выдаёт ошибку "член Triggers не распознан." Попытался изменить так
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                    <StackPanel Orientation="Horizontal">
                        <StackPanel.Style>
                            <Style TargetType="StackPanel">
                                <Style.Triggers>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="Visibility" TargetName="RemoveButton" Value="Visible" />
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </StackPanel.Style>
                        <TextBlock>Some</TextBlock>
                        <Button x:Name="RemoveButton"
                                Content="Удалить"
                                Visibility="Hidden"
                                />
                    </StackPanel>
Но тоже не работает. TargetName="RemoveButton" - не видит кнопку.
1
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
14.10.2018, 18:37  [ТС]
Элд Хасп, отладка показала, что бинд свойства проходит успешно, то есть не пишет в лог о ошибке привязки. Однако, ничего не работает. Пробовал задавать другие свойства, вроде IsEnabled, IsCaptured все тоже. Проверял перекрывает может быть StackPanel текстблок или еще что, тоже нет. Надо копать в чем-о другом. А вы проверяли работоспособность своего варианта?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
14.10.2018, 19:07
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
А вы проверяли работоспособность своего варианта?
Конечно!
Может быть это связанно с тем, что Вы использовали для контейнера StackPanel. Так как она уменьшается до размеров видимых элементов, то за их границей реакции не будет.
Миниатюры
Изменение видимости кнопки при наведении на элемент списка   Изменение видимости кнопки при наведении на элемент списка   Изменение видимости кнопки при наведении на элемент списка  

Изменение видимости кнопки при наведении на элемент списка  
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
14.10.2018, 19:11
Лучший ответ Сообщение было отмечено RaevskiAnatoly как решение

Решение

Да, мне что-то сразу в голову не пришло - можно привязку сделать не на StackPanel, а на LisBoxItem. Тогда реагирует на любое место в строке.
XML
1
2
3
4
5
6
7
8
9
10
11
12
                            <Button.Style>
                                <Style TargetType="Button">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding IsMouseOver, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="true">
                                            <Setter Property="Visibility" Value="Visible"/>
                                        </DataTrigger>
                                        <DataTrigger Binding="{Binding IsMouseOver, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="false">
                                            <Setter Property="Visibility" Value="Hidden"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Button.Style>
1
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
14.10.2018, 20:01  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Так как она уменьшается до размеров видимых элементов, то за их границей реакции не будет.
Точно, и по-моему даже H...Alignment = stretch не помогает, да?
Я думаю Grid слишком тяжелый контейнер, тогда уж лучше DockPanel?

Добавлено через 8 минут
Элд Хасп, Да, это куда надежней. У меня до не работало, т.к. я у кнопки задавал Visibility=Hidden. А триггеры работают по обратному механизму. Можно убрать триггер "включение видимости", оставить только один. И все равно работать будет. Т.к. изначально IsMouseOver установится в false, тогда видимость кнопки перейдет в hidden, а потом по принципу обртаного механизма, когда IsMouseOver=true, тогда вернется предыдущее значение - true. (Если изначально ставить hidden у кнопки, то вернется hidden и ничего не работает)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
14.10.2018, 20:07
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Точно, и по-моему даже H...Alignment = stretch не помогает, да?
Stack - в направлении компоновки (ориентации) не растягивается.
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Я думаю Grid слишком тяжелый контейнер, тогда уж лучше DockPanel?
Нет, grid лучше для данной задачи. Сделайте две колонки: первая ширина "*" для текстблок, вторая ширина "Auto" - для кнопки.

Добавлено через 3 минуты
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Можно убрать триггер "включение видимости", оставить только один.
Можно. Но я предпочитаю, если есть возможность, устанавливать явно. Уже сталкивался с таким, когда, после обновления системы или FW, значения по умолчанию менялись. И элемент начинал работать по другому.
Возьмите пример с дефолтных стилей элементов - там ни чего не оставляют на волю случая.
1
 Аватар для RaevskiAnatoly
34 / 35 / 12
Регистрация: 04.03.2017
Сообщений: 444
14.10.2018, 20:08  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Нет, grid лучше для данной задачи. Сделайте две колонки: первая ширина "*" для текстблок, вторая ширина "Auto" - для кнопки.
Установить растягивание в горизонт. А эти два элемента по бокам припечатать. И кнопку нужно, чтобы она была строго в самом боку (не люблю, когда кнопки разъезжают из-за размеров др элементов). Так что и док подойдет.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
14.10.2018, 20:14
Цитата Сообщение от RaevskiAnatoly Посмотреть сообщение
Установить растягивание в горизонт. А эти два элемента по бокам припечатать. И кнопку нужно, чтобы она была строго в самом боку (не люблю, когда кнопки разъезжают из-за размеров др элементов). Так что и док подойдет.
Если Вы потом захотите редактировать строки и замените TextBlock на TextBox - возможно опять будут проблемы из-за DockPanel.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.10.2018, 20:14
Помогаю со студенческими работами здесь

Изменение кнопки меню при наведении
Подскажите пожалуйста, как грамотней всего описать такое меню? при наведение кнопка должна становится черной.

Изменение координат кнопки при наведении курсора
всем привет как сделать что бы когда курсор мишки на него поставишь кнопка бутон от него сдвинулся помигите пожалуйста

Изменение цвета кнопки при наведении курсора
Как средствами c++ сделать так чтобы при наведении на кнопку(как hover в CSS) она меняла свой цвет

Изменение свойства source кнопки при наведении
Здравствуйте, помогите пожалуйста решить такую задачу: при наведении курсора на кнопку надо чтобы менялось изображение в блоке image, с...

Изменение цвета UI текста(кнопки) при наведении мышкой
Как изменить цвет текста кнопки и сам фон кнопки, одновременно? Стандартными путями Unity не получается. Пытался писать скрипт примерно...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru