2012-10-22 2 views
0

기본적으로 내 프로그램에서 간단하게 문제가 발생 했으므로 제대로 진행하고 싶습니다. 마우스 단추를 클릭 할 때 MouseEventHandler을 추가 한 다음 이벤트 핸들러가 제거 될 때까지 마우스를 따라 원을 이동해야합니다. 나는 아주 기본에 코드를 단순화 :마우스가 객체에 포커스를 잃으면 MouseMove 이벤트가 작동하지 않는 이유는 무엇입니까?

XAML :

<Window x:Class="WpfApplication1.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"> 
    <Grid Name="grid1" Background="White" MouseLeftButtonUp="grid_MouseUp"> 
     <Ellipse Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="{x:Null}" VerticalAlignment="Top" Width="50" Fill="Black" MouseLeftButtonDown="ellipse1_MouseDown" /> 
    </Grid> 
</Window> 

C 번호 :

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

    private static Point _oldPoint = new Point(), _newPoint = new Point(); 

    private void ellipse1_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     _oldPoint = e.GetPosition(grid1); 
     grid1.MouseMove += new MouseEventHandler(grid_MouseMove); 
    } 

    private void grid_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     grid1.MouseMove -= new MouseEventHandler(grid_MouseMove); 
    } 

    private void grid_MouseMove(object sender, MouseEventArgs e) 
    { 
     _newPoint = e.GetPosition(grid1); 
     ellipse1.Margin = new Thickness(ellipse1.Margin.Left - _oldPoint.X + _newPoint.X, ellipse1.Margin.Top - _oldPoint.Y + _newPoint.Y, 0, 0); 
     _oldPoint = _newPoint; 
    } 
} 

이제 일반적으로이 코드는 잘 작동하고 나는 그것을 확인하지 않는 한 아주 깔끔한 생각 마우스가 실제로 버튼을 누를 때까지의 마우스의 움직임 그러나 내 질문은 다음과 같습니다.

마우스 포인터가 원의 초점을 잃으면 (마우스를 너무 빨리 움직여서) MouseMove 이벤트를 원이 아닌 표에 추가해야했습니다. 더 이상 MouseMove 이벤트를 트리거하십시오. 그런데 정확히 그 일이 일어나는 이유는 무엇입니까? 이벤트의 시작 부분에서 마우스가 원 위에 명확히 위치 했으므로 움직였습니다. 예, 서클에서 멀어졌지만 여전히 이벤트를 실행해서는 안됩니까?

+1

[Mouse.Capture Method] (http://msdn.microsoft.com/en-us/library/ms591452.aspx)를 사용해 보셨습니까? – LPL

+0

@LPL Mouse.Capture 메서드는 어떻게 사용합니까? 나는 msdn 기사를 보았지만 직접적인 사용은별로 도움이되지 못했습니다. – phil13131

답변

2

capture the mouse 수 있으며 타원의 모든 이벤트를 처리 할 수 ​​있습니다. 내가 이동 ellipse1_MouseMove에 grid_MouseMove 이름을 변경 한

private void ellipse1_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    Mouse.Capture(ellipse1); 
    _oldPoint = e.GetPosition(grid1); 
    ellipse1.MouseMove += new MouseEventHandler(ellipse1_MouseMove); 
} 

private void ellipse1_MouseUp(object sender, MouseButtonEventArgs e) 
{ 
    Mouse.Capture(null); 
    ellipse1.MouseMove -= new MouseEventHandler(ellipse1_MouseMove); 
} 

뒤에이 코드

<Grid Name="grid1" Background="White"> 
    <Ellipse Height="50" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="{x:Null}" VerticalAlignment="Top" Width="50" Fill="Black" 
      MouseLeftButtonDown="ellipse1_MouseDown" MouseLeftButtonUp="ellipse1_MouseUp" /> 
</Grid> 

.

+0

고마워, 내 문제에 대한 대단한 사용. – phil13131

1

컨트롤은 마우스가 해당 컨트롤 위로 마우스를 가져 가면 마우스 이벤트 만 가져옵니다.

새 컨트롤로 이동하면 마우스가 이전 컨트롤에서 푸시되고 새 컨트롤에 연결됩니다.

전체 프로세스에 연결된 글로벌 후크를 만들 수있는 방법이 있지만 이것이 우리가 말하는 것이 아닙니다. 당신이 Grid.MouseDown 이벤트를 사용하고 체크 oldPointEllipse 내에있는 경우 다음 MouseMove 이벤트를 처리 한 경우 베드로가 한 말에 추가

+0

좋아요, 고마워, 나는 그게 비슷한 것 같아. 그래서 마우스가 초기 위치를 바꿀 때가 아니라 새로운 위치를 얻으면 이벤트가 트리거됩니까? – phil13131

+0

그것보다 조금 복잡합니다. 몇 가지 이벤트가 관련되어 있습니다. 또한 일부 사람들은 버튼 컨트롤에 대해 이전 컨트롤에 계속 알려줍니다. –

+0

OnMouseEnter/Leave가 "OnEnter/Leave"를 트리거하지 않습니까? 마우스가 시작 부분에 항상 움직여 서클에 들어 가지도 않고 떠난 것도 아닌데 어떻게하면 마우스가 움직일 수 있습니까? – phil13131

2

은이 이상한 행동을 늘 볼 수.

또한 drag 이벤트를 탐색하는 것이 좋습니다.

+0

이 컨텍스트에서 드래그 이벤트를 정확히 사용하려면 어떻게해야합니까? 정보 드래깅을 알고 있지만 WPF 항목을 드래그하는데도 사용할 수 있습니까? – phil13131

+0

첫 번째 제안에 대해서, 당신은'MouseLeave'를 통해 동일한 함수 (MouseMove)를 추가로 트리거하는 것을 의미합니까? – phil13131

+0

@Phil, 드래그 드롭 이벤트는 WPF 항목, 심지어 'Adorner'레이어에서도 작동합니다. –

관련 문제