WPF Не отправлять события MouseMove после CaptureMouse (); - PullRequest
1 голос
/ 02 августа 2010

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

Это пользовательский элемент управления "mycanvas", а прямоугольники - это пользовательские элементы управления "foo". XAML для них (за исключением преамбулы):

mycanvas.xaml:

<Canvas MouseDown="CanvasMouseDown" MouseMove="CanvasMouseMove" MouseUp="CanvasMouseUp" Background="White">

    <my:Foo HorizontalAlignment="Left" Canvas.Left="97" Canvas.Top="30" x:Name="m_foo" VerticalAlignment="Top" Height="87" Width="128" />
</Canvas>

foo.xaml:

<Border BorderThickness="2" BorderBrush="Black" CornerRadius="15" Background="Plum">
    <Grid>
        <Label Content="Foo" Height="28" HorizontalAlignment="Left" Margin="6,6,0,0" Name="label1" VerticalAlignment="Top" />
    </Grid>
</Border>

И вот обработчики: mycanvas.xaml.cs:

private void CanvasMouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.Source is Foo)
    {
        m_moving = e.Source as Foo;
        CaptureMouse();
        e.Handled = true;
    }
}

private void CanvasMouseMove(object sender, MouseEventArgs e)
{
    if (m_moving != null)
    {
        Canvas.SetLeft(m_moving, e.GetPosition(this).X);
        Canvas.SetTop(m_moving, e.GetPosition(this).Y);
    }
}

private void CanvasMouseUp(object sender, MouseButtonEventArgs e)
{
    ReleaseMouseCapture();
    m_moving = null;
}

MouseDown срабатывает, и поэтому вызывается CaptureMouse (и работает, потому что я больше не могу закрыть приложение или щелкнуть в нем что-либо еще!), Но MouseMove больше не вызывается - так куда же теперь отправляются события MouseMove ?? ?

Если я alt-tab для другого приложения, а затем возвращаюсь теперь внезапно вызывается MouseMove и Foo перемещается с помощью мыши.

Ответы [ 2 ]

8 голосов
/ 02 августа 2010

Попробуйте либо:

Mouse.Capture(this, CaptureMode.SubTree);

или

m_moving.CaptureMouse();
...
if (m_moving != null)
{
    m_moving.ReleaseMouseCapture();
    m_moving = null;
}

События мыши были вызваны Foo, а не Canvas, поэтому при захвате мыши с помощью Canvas выне дать им подняться.

1 голос
/ 19 ноября 2014

Вы можете напрямую использовать событие MouseMove в окне:

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.MouseMove += MouseEventHandler;

    }

    private void MouseEventHandler(Object sender, MouseEventArgs e)
    {
        System.Windows.Point position = e.GetPosition(this);

        Canvas.SetLeft(ElipseElement, position.X-5);
        Canvas.SetTop(ElipseElement, position.Y-5);    


    }
}
...