2011-07-16 35 views
8

¿Hay alguna manera de enlazar la posición del mouse en WPF en el archivo XAML? ¿O eso tiene que hacerse en código? Tengo un control dentro de un lienzo, y solo quiero que el control siga al mouse mientras el cursor del mouse está dentro del lienzo.WPF: ¿cómo puedo unir la posición de un control a la posición actual del mouse?

Gracias


EDIT:

bien, lo he descubierto una manera relativamente fácil usando el archivo de código subyacente. He añadido un controlador de eventos MouseMove en el lienzo, y luego agregó:

private void Canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     // Get the x and y coordinates of the mouse pointer. 
     System.Windows.Point position = e.GetPosition(this); 
     double pX = position.X; 
     double pY = position.Y; 

     // Sets the position of the image to the mouse coordinates. 
     myMouseImage.SetValue(Canvas.LeftProperty, pX); 
     myMouseImage.SetValue(Canvas.TopProperty, pY); 
    } 

usando http://msdn.microsoft.com/en-us/library/ms746626.aspx como pauta.

Respuesta

8

Intenté hacer una especie de decorador para este propósito. Concluye el objeto, la posición del mouse sobre la que desea controlar y enlaza algún control con la propiedad del decorador MousePosition.

public class MouseTrackerDecorator : Decorator 
{ 
    static readonly DependencyProperty MousePositionProperty; 
    static MouseTrackerDecorator() 
    { 
     MousePositionProperty = DependencyProperty.Register("MousePosition", typeof(Point), typeof(MouseTrackerDecorator)); 
    } 

    public override UIElement Child 
    { 
     get 
     { 
      return base.Child; 
     } 
     set 
     { 
      if (base.Child != null) 
       base.Child.MouseMove -= _controlledObject_MouseMove; 
      base.Child = value; 
      base.Child.MouseMove += _controlledObject_MouseMove; 
     } 
    } 

    public Point MousePosition 
    { 
     get 
     { 
      return (Point)GetValue(MouseTrackerDecorator.MousePositionProperty); 
     } 
     set 
     { 
      SetValue(MouseTrackerDecorator.MousePositionProperty, value); 
     } 
    } 

    void _controlledObject_MouseMove(object sender, MouseEventArgs e) 
    { 
     Point p = e.GetPosition(base.Child); 

     // Here you can add some validation logic 
     MousePosition = p;    
    } 
} 

y XAML

<local:MouseTrackerDecorator x:Name="mouseTracker"> 
    <Canvas Width="200" Height="200" Background="Red"> 
     <Button Width="20" Height="20" Canvas.Left="{Binding ElementName=mouseTracker, Path=MousePosition.X}" Canvas.Top="{Binding ElementName=mouseTracker, Path=MousePosition.Y}" /> 
    </Canvas> 
</local:MouseTrackerDecorator> 
+0

Gracias, esto es muy útil para mí, no sólo por la posición del ratón, pero para ' extrayendo 'otras propiedades usando el Decorador. – pkr298

0

había juzgado sólo algunos ejemplos. La documentación de MSDN es, creo, de forma incorrecta redactado

"Cómo hacer que un objeto sigue el puntero del mouse" debería ser

"Cómo: Hacer aumentar tamaño de un objeto basándose en la posición del ratón" de todos modos.

Pude lograr este efecto cambiando las propiedades del lienzo. Además, no estoy seguro de por qué todos estaban conectando el controlador de eventos a la siguiente propiedad de diseño de nivel superior de objetos y no a la ventana. Tal vez usted y la mayoría de los ejemplos en línea va para un efecto diferente

<Window x:Class="FollowMouse.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" MouseMove="MouseMoveHandler"> 
<Canvas> 
    <Ellipse Name="ellipse" Fill="LightBlue"Width="100" Height="100"/> 
</Canvas> 

código detrás

private void MouseMoveHandler(object sender, MouseEventArgs e) 
{ 
    /// Get the x and y coordinates of the mouse pointer. 
    System.Windows.Point position = e.GetPosition(this); 
    double pX = position.X; 
    double pY = position.Y; 

    /// Sets eclipse to the mouse coordinates. 
    Canvas.SetLeft(ellipse, pX); 
    Canvas.SetTop(ellipse, pY); 
    Canvas.SetRight(ellipse, pX); 
    } 
Cuestiones relacionadas