Blog de Julien Dollon (MVP)

Project Manager / Architecte / Formateur

Julien Dollon

Architecte et formateur pour I'FORM/Exakis et Full Professor SUPINFO.

Responsable de la communauté Dotnet-France, Scrum Master pour le projet AHEAD ainsi que nommé Most Valuable Professional, je participe activement à la communauté Microsoft.


 

Mon CV de Consultant/Formateur .NET

Mon Transcript de Formateur .NET

J'interviens en consulting et formation sur les technologies .NET, ALM/TFS, Agilité/Scrum, SharePoint et SQL Server





 
 
 
 
Official INETA Logo
 
IForm


[Silverlight] Détecter la molette de la souris

Très souvent les applications Silverlight ne prennent pas en compte la molette de la souris ce qui peux énerver l’utilisateur, surtout quand on recherche une “expérience utilisateur hors du commun”.

La solution pour implémenter le MouseWheel est simple: créer une zone avec un ScrollViewer et capturer le MouseWheel de la souris par rapport au navigateur.

Exemple de Page.xaml:

<UserControl
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	x:Class="Wheel.Page"
	Width="640" Height="364">

	<Grid x:Name="LayoutRoot" Background="White">
		<ScrollViewer Margin="65,25,196,164" x:Name="scroll">
			<ScrollViewer.Background>
				<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
					<GradientStop Color="#FF000000"/>
					<GradientStop Color="#FFFFFFFF" Offset="1"/>
				</LinearGradientBrush>
			</ScrollViewer.Background>
			<Grid Height="Auto" Width="Auto">
				<Button Content="Button" Height="400" Width="200"/>
			</Grid>
		</ScrollViewer>
	</Grid>
</UserControl>

mousewheel1

Puis côté code behind on s’abonne à l’événement du navigateur MouseWheel (différents événements suivant le navigateur):

		public Page()
		{
			// Required to initialize variables
			InitializeComponent();
            HtmlPage.Window.AttachEvent("DOMMouseScroll", OnMouseWheel);
            HtmlPage.Window.AttachEvent("onmousewheel", OnMouseWheel);
            HtmlPage.Document.AttachEvent("onmousewheel", OnMouseWheel);
		}

Puis on crée la méthode OnMouseWheel qui va incrémenter le scroll ou non de notre scrollviewer:

private void OnMouseWheel(object sender, HtmlEventArgs args)
        {
            double mouseDelta = 0;
            ScriptObject e = args.EventObject;
            // Mozilla and Safari
            if (e.GetProperty("detail") != null)
                mouseDelta = ((double)e.GetProperty("detail"));

            // IE and Opera
            else if (e.GetProperty("wheelDelta") != null)
                mouseDelta = ((double)e.GetProperty("wheelDelta"));
            mouseDelta = Math.Sign(mouseDelta);

            if(mouseDelta.Equals(1))
                scroll.ScrollToVerticalOffset(scroll.VerticalOffset + 10);
            else
                scroll.ScrollToVerticalOffset(scroll.VerticalOffset - 10);
        }

mousewheel2

EDIT:

après une recherche suite à la remarque de lionel, il n’est pas possible de capturer le MouseWheel sur un DOM lorsque l’application est en plein écran.

Posted: Mar 06 2009, 10:43 by juliend | Comments (5) RSS comment feed |
  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Filed under: .NET | Général | WPF/Silverlight

Comments

lionel limozin said:

ça marche en mode pmlein écran ?

# March 09 2009, 18:08

Jules said:

Effectivement non ... je vais chercher et postez aussi dessus !
Merci beaucoup ;)

# March 09 2009, 19:28

Laurent said:

Pour le mode plein écran, il te faut considérer SL comme une application et plus comme un élément dans le navigateur.

Application.Current.RootVisual.MouseWheel += new MouseWheelEventHandler(RootVisual_MouseWheel);
Ça marche sans soucis.

# October 30 2009, 17:59

juliend said:

A l'epoque de l'écriture de ces lignes, j'étais en Silverlight 2. Ta technique ne vient que du 3 (technique dont je parle dans mon livre blanc sur Silverlight 3).

# October 30 2009, 18:12

Fabien Lavocat said:

Super article qui m'a bien aidé !
Merci Julien Smile

# November 20 2009, 11:53

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading

captcha

*