Почему событие IsPressedChanged не работает с триггером взаимодействия, а другие события работают?

Редактировать: Короче говоря: как указал в своем ответе AFigmentOfMyImagination, события IsPressedChanged не существует. Однако вот исходный вопрос:

У меня есть кнопка, и я хочу, чтобы команда выполнялась как при нажатии кнопки, так и при ее отпускании. Стандартная привязка команд к кнопкам может вызывать команду только тогда, когда кнопка нажата ИЛИ отпущена, поэтому я решил, что могу добиться того, чего хочу, используя триггер взаимодействия для события IsPressedChanged, например:

<Button xmlns:i = "http://schemas.microsoft.com/xaml/behaviors">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName = "IsPressedChanged">
            <i:InvokeCommandAction Command = "{Binding Path=SomeCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

Но это не работает. Однако это работает, когда я использую другие события, такие как событие MouseEnter.

Теперь мой вопрос, почему так? В чем отличие мероприятия IsPressedChanged от других мероприятий? Мне кажется, что есть какая-то концептуальная разница, и я хотел бы знать, что это такое (и, может быть, почему должна быть разница).

Редактировать: Я нашел способ, чтобы команда выполнялась при каждом IsPressed изменении. Это решение используется в этот вопрос.

Я думаю, вы хотите использовать OnIsPressedChanged вместо IsPressedChanged

ɐsɹǝʌ ǝɔıʌ 13.05.2022 14:12

Нет такого события с именем "IsPressedChanged". Существует свойство зависимости «IsPressed», изменения которого вы можете наблюдать/реагировать.

lidqy 13.05.2022 14:14

@Felix: Ты не можешь справиться с событиями MouseLeftButtonDown и MouseLeftButtonUp?

mm8 13.05.2022 15:06

@mm8: Да, но они не будут работать с указывающими устройствами, кроме мыши.

Felix 13.05.2022 15:08

@mm8: Это правильно. Мой вопрос был, ПОЧЕМУ это не сработало, и AFigmentOfMyImagination отлично ответила на него. (Я уже понял, как обрабатывать событие, используя реализацию настраиваемой кнопки и маршрутизируемое событие CustomIsPressedChanged. Я задам еще один вопрос о другой проблеме, как только мне будет разрешено.)

Felix 13.05.2022 15:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Разница между IsPressedChanged и MouseEvent заключается в том, что MouseEvent — это событие, предоставляемое Button, а IsPressedChanged — нет.

Иными словами, то, чего не существует, не может по-настоящему "работать"...

Хм, это было слишком просто. Спасибо за указание на это.

Felix 13.05.2022 15:11

Триггер события используются для перенаправленного события.
Нет перенаправленного события IsPressedChanged, единственное перенаправленное событие, предоставляемое Button, — это Нажмите, и оно не соответствует вашим потребностям.
В Глобальный перенаправленные события вы можете найти Mouse.MouseDown и Mouse.MouseUp, но вы пропустите случаи, когда кнопка нажимается с помощью клавиатуры.

Вы можете использовать свойство Button.IsPressed через триггер данных и установив источник привязки в качестве кнопки (используя имя элемента или Относительный источник).
Но вам придется немного бодж, чтобы он срабатывал, если значение равно true или false.
К счастью, ни true, ни false не равны пустой строке. Установив DataTrigger.Comparison на "NotEqual" и Value на "", вы гарантируете, что триггер срабатывает при каждом изменении IsPressed.
(Возможный нежелательный эффект: он срабатывает сразу после создания элемента управления.)

<Button x:Name = "Button">
    <i:Interaction.Triggers>

<!--
        You can also use this binding
        <i:DataTrigger Binding = "{Binding RelativeSource = {RelativeSource AncestorType=Button},  
                                         Path=IsPressed}"
-->

        <i:DataTrigger Binding = "{Binding ElementName=Button, Path=IsPressed}"
                       Comparison = "NotEqual"
                       Value = "">
            <i:InvokeCommandAction Command = "{Binding Path=PressedChangedCommand}"/>
        </i:DataTrigger>
    </i:Interaction.Triggers>
</Button>

Доступна рабочая демонстрация здесь.

Вы можете удалить строку Value = "", так как unset не равно ни True, ни False. Но вы можете потерять ясность.

Orace 13.05.2022 16:02

Вау, это отличное решение. Это намного компактнее, чем создание пользовательской кнопки, которая запускает новое перенаправленное событие из метода OnIsPressedChanged. Большое спасибо!

Felix 13.05.2022 16:20

Другие вопросы по теме