WPF - как связать позицию элемента управления с текущей позицией мыши? - PullRequest
8 голосов
/ 16 июля 2011

Есть ли способ привязать положение мыши в WPF в файле XAML?Или это должно быть сделано в коде?У меня есть элемент управления в Canvas, и я просто хочу, чтобы элемент управления следовал за мышью, пока курсор мыши находится внутри Canvas.

Спасибо


РЕДАКТИРОВАТЬ:

Хорошо, я понял это относительно простым способом, используя файл с выделенным кодом.Я добавил обработчик событий MouseMove на Canvas, а затем добавил:

    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);
    }

, используя http://msdn.microsoft.com/en-us/library/ms746626.aspx в качестве ориентира.

Ответы [ 2 ]

8 голосов
/ 16 июля 2011

Я пытался сделать своего рода декоратор для этой цели.Вы оборачиваете объект, положение мыши над которым хотите управлять, и привязываете некоторый элемент управления к свойству 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;            
    }
}

и 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 голосов
/ 22 ноября 2012

Перепробовал только несколько примеров. Я думаю, что документация msdn неверно сформулирована

"Как сделать объект следующим за указателем мыши" должно быть

"Как: увеличить размер объекта в зависимости от положения мыши" в любом случае.

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

<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>

код позади

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);
  }
...