Редактировать: Короче говоря: как указал в своем ответе 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
изменении. Это решение используется в этот вопрос.
Нет такого события с именем "IsPressedChanged". Существует свойство зависимости «IsPressed», изменения которого вы можете наблюдать/реагировать.
@Felix: Ты не можешь справиться с событиями MouseLeftButtonDown
и MouseLeftButtonUp
?
@mm8: Да, но они не будут работать с указывающими устройствами, кроме мыши.
@mm8: Это правильно. Мой вопрос был, ПОЧЕМУ это не сработало, и AFigmentOfMyImagination отлично ответила на него. (Я уже понял, как обрабатывать событие, используя реализацию настраиваемой кнопки и маршрутизируемое событие CustomIsPressedChanged. Я задам еще один вопрос о другой проблеме, как только мне будет разрешено.)
Разница между IsPressedChanged
и MouseEvent
заключается в том, что MouseEvent
— это событие, предоставляемое Button
, а IsPressedChanged
— нет.
Иными словами, то, чего не существует, не может по-настоящему "работать"...
Хм, это было слишком просто. Спасибо за указание на это.
Триггер события используются для перенаправленного события.
Нет перенаправленного события 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
. Но вы можете потерять ясность.
Вау, это отличное решение. Это намного компактнее, чем создание пользовательской кнопки, которая запускает новое перенаправленное событие из метода OnIsPressedChanged. Большое спасибо!
Я думаю, вы хотите использовать
OnIsPressedChanged
вместоIsPressedChanged