03 setembro, 2009

MouseWheelScrollBehavior para Silverlight 3

Acabei de publicar uma behavior na galeria do Microsoft Expression. Como já deve ter ficado claro pelo título do post, esta behavior implementa scroll em controles pela roda do mouse. Agora podemos ter esse recurso em nossas aplicações sem precisar ficar escrevendo código (aliás, eu acho que o controle ScrollViewer já deveria ter essa implementação nativamente, mas…).

image

Esta behavior pode ser aplicada a qualquer controle. Se o controle for um ScrollViewer ou tiver algum ScrollViewer em seu template, a behavior se encarregará de efetuar o scroll, repondendo ao evento MouseWheel (que é novo no Silverlight 3).

Como a behavior está utilizando o evento MouseWheel (e não javascript), a behavior também funciona normalmente quando a aplicação é executada fora do browser. Não fiz nenhum teste para ver como ela se comporta com aplicações WPF, mas acredito que também deva funcionar normalmente.

É possível configurar qual direção de scroll deve ser utilizada ou deixar a behavior decidir automaticamente (padrão). Se estiver no automático, a behavior vai tentar primeiro fazer rolagem vertical e, se não conseguir, vai tentar fazer rolagem horizontal.

Também é possível inverter a direção do scroll

image

O código fonte da behavior e da aplicação de exemplo estão publicados na galeria do Expression.

http://gallery.expression.microsoft.com/en-us/MouseWheelScroll

Qualquer sugestão de melhoria e correção de bug é bem vinda.

3 comentários:

Thiago disse...

Eu ja utilizava behaviors para realizar scroll atravez do mouse wheel. Existem algumas implementações na internet, como http://compiledexperience.com/blog/posts/Updated-Silverlight-Mouse-Wheel-Behavior e http://www.nikhilk.net/Silverlight-MouseWheel.aspx. Essa funcionalidade é um bom exemplo para explicar a utilidade dos behaviors do Silverlight. Flw abraço.

Kelps Leite de Sousa disse...

Thiago,
Eu também já havia visto esses dois exemplos mas o primeiro só funciona se for associado diretamente ao ScrollViewer, então se eu quiser utilizar em um ComboBox ou ListBox teria que customizar o template.

O segundo, utiliza o SilverlightFX, que implementa o scroll via javascript, então não funciona fora do browser nem em full screen.

Além disso, esses 2 exemplos só fazem scroll vertical. A minha implementação faz scroll vertical e horizontal (que é menos comum mas é tão útil quanto o vertical).

Decidi publicar no Expression Galery para que fique mais fácil de ser encontrada e reaproveitada por outras pessoas.

Um ponto fraco da minha implementação é que não funciona no Mac (pois e evento MouseWheel não é suportado em Mac no Silverlight 3, mas como nem todos os mouses de Mac têm scroll, não faz muita diferença. Se eu arrumar alguém para testar, talvez eu faça uma alteração para que utilize a implementação em javascript quando estiver rodando em um Mac, assim os seguidores da maçã terão a funcionalidade pelo menos enquanto estiverem rodando dentro do browser.

T+
Kelps

Felipe V. Rigo disse...

Oi Kelps,
mto obrigado pela contribuição.
Também acho q o ScrollViewer já deveria implementar isso nativamente.
Para mim estava dando erro, aí descobri q era pq eu tava sem o SDK do Silverlight 3 instalado...
abraços