WPF Законно ли вызывать другое событие из метода event-invocation - PullRequest
0 голосов
/ 23 сентября 2010

Следующий код был частью ответа, который я получил, чтобы решить probem , который я разместил в SO. Он работает нормально, однако мне любопытно, разрешено ли вручную вызывать другое событие из invocation-метод с EventArgs исходного события:

protected override void OnMouseLeftButtonUp( MouseButtonEventArgs e )   {   
    base.OnMouseLeftButtonDown( e );   
}  

Я часто видел этот шаблон, но никогда не использовал его, потому что всегда боялся, что это может привести к побочным эффектам или проблемам в будущих версиях WPF. Кто-нибудь подскажет мне, сохраняются ли такие перенаправленные вызовы событий?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2010

Было бы намного лучше, если бы появилось новое событие или метод, который могли бы вызывать как OnMouseLeftButtonDown, так и OnMouseLeftButtonUp, с соответствующим именем, уточняющим ваше намерение. Как сейчас написано в коде, контроль в основном лживый, который работает только до тех пор, пока ваши клиенты никогда не называют ваш блеф и полагаются на вашу правдивость. Это та вещь, которая с более сложным кодом может привести к очень неприятным сеансам отладки. Намного лучше структурировать и назвать свой код так, чтобы вы выражали свое намерение, а не лгали, чтобы добиться удобного побочного эффекта.

1 голос
/ 23 сентября 2010

Я был бы очень осторожен с этим. Если данные события содержат материал, относящийся только к исходному событию, эти данные могут спутать другой обработчик события. Особенно, когда речь идет о событиях от внешних устройств, таких как мышь.

Может быть, этот пример, который вы разместили, в порядке, я не знаю. Но я определенно вижу проблему, если делать наоборот, поднимать мышь вниз, когда вы поднимаете мышь - обработчик нажатия мыши мог (потенциально, я понятия не имею, если это так) запрашивать устройство ввода для фактического состояния эта мышь, и они не будут совпадать. Или, возможно, сделайте какую-нибудь операцию с мышью, которая работает только при нажатии и т. Д.

Итак, подведем итог: это может сработать, но я бы не стал полагаться на это, если вы не уверены на 100%, что оно не сломается при определенных условиях

1 голос
/ 23 сентября 2010

Я не вижу причин, по которым вы бы не смогли этого сделать, вы просто вызываете метод базового класса.Где-то есть WndProc (), который получает реальные сообщения Windows и переводит их в тот же вызов, который вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...