2010-08-02 3 views
1

마우스를 사용하여 드래그 할 수있는 둥근 사각형이있는 WPF 캔버스를 만들려고합니다. 그러나 캔버스에서 마우스를 잡으면 움직이는 이벤트가 더 이상 발생하지 않습니다.WPF CaptureMouse() 후에 MouseMove 이벤트를 보내지 않습니다.

이것은 "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가 호출됩니다 (더 이상 clo 할 수 없어 작동 함). 앱을 보거나 그 안에있는 다른 것을 클릭하십시오!)하지만 MouseMove는 더 이상 호출되지 않습니다. - 그래서 MouseMove 이벤트는 이제 어디로 보내 집니까 ???

다른 응용 프로그램으로 이동 한 다음 다시 돌아가서 suddendly MouseMove가 호출되고 Foo가 마우스로 이동합니다.

답변

7

중 하나를 시도해보십시오 당신이 캔버스에 마우스를 캡처 할 때

Mouse.Capture(this, CaptureMode.SubTree); 

또는

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

마우스 이벤트

가 아니라 캔버스에 의해, 푸에 의해 제기되고 있었다, 그래서 당신은 것을 방지 제기되고있다.

+0

가 작동하는 것 같다. 감사. (아직도 이해가 안되는 이유지만, 헤이 ..) – MrPurpleStreak

1

직접 창에 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);  


    } 
} 
관련 문제