Как объявить обработчик OnPointerEntered с помощью cppwinrt?

В cppwinrt (xaml еще не доступен) у меня есть обработчик события PointerEntered для кнопки, и он отлично работает. Но при попытке удалить поведение при наведении курсора по умолчанию для этой кнопки, которая отображается как изображение, мне кажется, что вместо этого мне может потребоваться обработать событие OnPointerEntered - я видел решения, которые включают использование триггера xaml, и это, похоже, эквивалент кода . Но OnPointerEntered имеет другой список аргументов, и я не могу найти способ вызвать его, который будет построен. Вот как успешно объявляется дескриптор события PointerEntered:

button.PointerEntered([&](winrt::Windows::Foundation::IInspectable const & sender, Windows::UI::Xaml::RoutedEventArgs const & args) { EnteredButton(); });

Это строит и правильно вызывает EnteredButton. Но

button.OnPointerEntered([&](winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const & e)
{
    EnteredButton();
});

не будет строить - я неверно декларирую, но не знаю как, попробовав несколько вариантов. (Использование полностью определенных имен, возможно, не обязательно, но, похоже, не повредит в любом случае). Можно ли использовать OnPointerEntered в cppwinrt и как его объявить в таком случае? Я попытался использовать IPointerRoutedEventArgs вместо PointerRoutedEventArgs, но безрезультатно. Или - если кто-нибудь знает другой способ отключить эффект наведения в кнопке, созданной с помощью cppwinrt, это сработает.


person user3743210    schedule 21.12.2017    source источник
comment
Я не знаю ответа на ваш вопрос, но PointerEntered позволяет вам настроить делегат, вызываемый при запуске события, тогда как OnPointerEntered реализован в IControlOverridesT, что настоятельно предполагает, что это член, который вы можете переопределить, и предоставить ваша собственная реализация. Я не знаю, но предполагаю, что OnPointerEntered вызывается по умолчанию, если вы не настроили собственный делегат с помощью PointerEntered.   -  person IInspectable    schedule 22.12.2017
comment
Дополнительная информация доступна в On * обработчик событий переопределяет тему.   -  person IInspectable    schedule 22.12.2017
comment
Что было бы действительно здорово, учитывая частоту появления подобных вопросов, было бы, если бы у Button был просто флаг, который отключал бы эффект наведения.   -  person user3743210    schedule 22.12.2017
comment
Подождите, учитывая историю ваших вопросов, это больше похоже на то, что вы не реализовали должным образом рендеринг, что происходит во время эффекта наведения. Решение не в том, чтобы отключить наведение, а вместо этого исправить рендеринг.   -  person IInspectable    schedule 22.12.2017
comment
Inspectable - спасибо, но кнопки работают прекрасно, за исключением того, что кисть изображения исчезает при вводе указателя. Я видел очень много решений xaml, предлагаемых для устранения эффекта зависания, но, я думаю, никто еще не упомянул рендеринг. Не для того, чтобы показать свое невежество, но я впервые слышу упоминания о необходимости реализовать что-либо, связанное с рендерингом. Не могли бы вы дать конкретную ссылку?   -  person user3743210    schedule 22.12.2017
comment
У меня нет ссылки. Звучит неправдоподобно, что кнопка - вероятно, один из наиболее распространенных элементов управления пользовательского интерфейса - не работает при определенных, общих условиях, например при наведении курсора. Это больше похоже на проблему со стилем, то есть вы изменили нормальное состояние, но также не смогли настроить состояние наведения. Хотя нет ссылки, и я тоже могу ошибаться.   -  person IInspectable    schedule 22.12.2017
comment
Это не сбой - он просто выполняет то, что обычно делают кнопки. Я установил Background для ImageBrush, чтобы он отображал растровое изображение, а не текст. И когда срабатывает эффект наведения по умолчанию, изображение исчезает и заменяется кистью наведения по умолчанию на время наведения. Некоторые люди спрашивали, как этого избежать, но все решения, которые я видел, включают создание настраиваемого шаблона кнопки в xaml. Я ищу способ добиться этого на C ++.   -  person user3743210    schedule 22.12.2017
comment
Извините, не могу переместить это в чат, если у вас больше репутации. Вы упомянули настройку состояния зависания. Это именно то, что я хотел бы знать, как программно делать на C ++. В идеале наведение просто изменит непрозрачность изображения или, по крайней мере, ничего не сделает.   -  person user3743210    schedule 22.12.2017


Ответы (1)


Вы не можете делать то, о чем просите. Вторя комментарию IInspectable:

  • PointerEntered - это событие в Windows :: UI :: Xaml :: UIElement. Ваш код правильно объявляет обработчик для него.
  • OnPointerEntered - не событие, поэтому обработать его невозможно. Это переопределяемый метод, для которого вы можете предоставить свою собственную реализацию.
person Ryan Shepherd    schedule 18.01.2018
comment
Спасибо - я использовал неправильную терминологию. Если это поможет кому-то еще, я решил свою проблему следующим образом: я создал свой собственный класс кнопки, используя StackPanel в качестве тела кнопки, и обработал события PointerEntered и т. Д. Для кнопки доступны две кисти ImageBrushes: одна для включенного изображения, а другая - для выключения. Таким образом я могу показать эффект зависания или нет, как мне нравится. Здесь используется лямбда, и аргументы не требуются: m_body.PointerEntered ([&] (winrt :: Windows :: Foundation :: IInspectable const & sender, IPointerRoutedEventArgs const & args) {ButtonEntered ();}); - person user3743210; 19.01.2018