2015-01-15 9 views
0

내 MainPage에서 StackPanel을 여러 가지 사각형으로 채우고 모두 마진을 (0,5,0,5)로 설정합니다. 사용자가이 사각형을 수평으로 만 이동하도록 허용하고 싶습니다. Rectangle에는 Mouse 이벤트가 없으므로 포인터를 사용하여이를 수행합니다. 흐름은 다음과 같습니다. 사용자가 사각형을 선택하여 선택하고, 커서가 사용자에게 시각적 큐를 제공하도록 변경하고, 사용자가 사각형을 왼쪽이나 오른쪽으로 드래그합니다. (Stackpanel에는 수직 스크롤 뷰어가 있습니다. 여기마우스/포인터 이벤트처럼 Rectangle이 터치 이벤트에 반응하도록하려면 어떻게해야합니까?

private void Rectangle_FirstClick(object sender, EventArgs e) 
{ 
    // Give rectangle a white border to imply selection 
    Rectangle myControl = sender as Rectangle; 
    myControl.StrokeThickness = 1; 
    myControl.Stroke = new SolidColorBrush(Color.FromArgb(255, 240, 240, 240)); 

    // Provide visual cue to mouse users by changing the pointer immediately 
    Window.Current.CoreWindow.PointerCursor = new Windows.UI.Core.CoreCursor(Windows.UI.Core.CoreCursorType.SizeWestEast, 0); 

    // Handle mouse leaving/re-entering the track piece 
    myControl.PointerEntered += MyControl_PointerEntered; 
    myControl.PointerExited += MyControl_PointerExited; 

    // Handle the drag event 
    myControl.PointerPressed += MyControl_PointerPressed; 
    myControl.PointerReleased += MyControl_PointerReleased; 
    myControl.PointerMoved += MyControl_PointerMoved; 
} 

가이 코드는 마우스 위대한 작품

bool PossibleDragStart = false; 
Point InitialDragPoint = new Point(0, 0); 

private void MyControl_PointerExited(object sender, PointerRoutedEventArgs e) 
{ 
    Window.Current.CoreWindow.PointerCursor = new Windows.UI.Core.CoreCursor(Windows.UI.Core.CoreCursorType.Arrow, 0); 
} 

private void MyControl_PointerEntered(object sender, PointerRoutedEventArgs e) 
{ 
    Window.Current.CoreWindow.PointerCursor = new Windows.UI.Core.CoreCursor(Windows.UI.Core.CoreCursorType.SizeWestEast, 0); 
} 

private void MyControl_PointerPressed(object sender, PointerRoutedEventArgs e) 
{ 
    PossibleDragStart = true; 
    InitialDragPoint = e.GetCurrentPoint(sender as Rectangle).Position; 
} 

private void MyControl_PointerReleased(object sender, PointerRoutedEventArgs e) 
{ 
    PossibleDragStart = false; 
} 

private void MyControl_PointerMoved(object sender, PointerRoutedEventArgs e) 
{ 
    // If pointer pressed without release, and then moved, we are dragging 
    if (PossibleDragStart) 
    { 
     Point CurrentDragPoint = e.GetCurrentPoint(AudioTracksRightContainer).Position; 
     StatusBar.Text = CurrentDragPoint.X.ToString(); 

     // Calculate drag offset by subtracting Current Position from Initial Position 
     double SegmentMargin = CurrentDragPoint.X - InitialDragPoint.X; 

     // Move the Rectangle with the pointer drag 
     Rectangle trackSegment = sender as Rectangle; 
     trackSegment.Margin = new Thickness(SegmentMargin, 5, 0, 5); 
    } 
} 

개별 이벤트 핸들러,하지만 난 터치를 위해 그것을 사용하려고하면, 내가해야 눌러-과 : 여기 내 C# 코드입니다 드래그를 시작하기를 원한다. 그리고 심지어 사각형은 머무르기 전에 몇 개의 단위 만 움직인다. 나는 왜 행동이 다른지 잘 모르겠습니다.

이 코드의 또 다른 문제점은 직사각형이 너무 좁아서 빠르게 드래그하고 사각형이 커서를 따라갈 수없는 경우 커서가 사각형 경계를 벗어 났을 때 드래그를 중지한다는 것입니다. 터치가 작동하지 않는 것보다 훨씬 작은 문제이지만, 그럼에도 불구하고 조금 성가시다.

답변

1

ScrollViewer가 자체 스크롤을 수행하기 위해 터치 이벤트를 캡처하는 것처럼 들립니다. 수동으로 조작을 처리하는 대신 Xaml의 조작 엔진을 사용하여 조작 이벤트에 등록 할 수 있습니다. 이것은 코드 작성이 쉽고 효율적입니다. 기본적으로 터치 및 마우스에서 작동합니다. 당신은 단지 당신이 대신 CompositeTransform의 TranslateTransform을 사용할 수 있습니다, 또는 당신이 회전과 스케일링에 추가 할 수 있습니다 번역을하려면

private void Rectangle_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 
{ 
    UIElement elem = sender as UIElement; 
    CompositeTransform ct = elem.RenderTransform as CompositeTransform; 

    ct.TranslateX += e.Delta.Translation.X; 
} 

다음 Rectangle_ManipulationDelta 방법에

<Rectangle Margin="5" Fill="Orange" Height="100" Width="200" 
      ManipulationMode="TranslateX" 
      ManipulationDelta="Rectangle_ManipulationDelta" 
      > 
    <Rectangle.RenderTransform> 
     <CompositeTransform /> 
    </Rectangle.RenderTransform> 
</Rectangle> 

는 사각형을 번역합니다.

제스처 및 조작 이벤트 사용에 대한 자세한 내용은 Quickstart: Touch input (XAML)을 참조하십시오.

내 블로그 항목 Where did all my gestures go?에서 포인터 처리를 담당하는 ScrollViewer에 대해 논의합니다. 포인터 이벤트를 직접 처리하려는 경우 드래그하는 동안 ScrollViewer를 비활성화하는 방법에 대해 설명합니다. capturing the pointer하여 손가락이 목표보다 빠르게 움직이는 경우를 처리 할 수 ​​있습니다. 조작 이벤트를 처리 할 경우에는 필요하지 않습니다.

+0

감사의 말 Rob, 완벽하게 작동하고 코드를 간소화했습니다. 나는 ManipulationMode를 인식하지 못했지만, 지금 나는 알고있다 :) – Freakishly