2013-07-12 2 views
0

내 xaml에 아래와 같이 정의 된 목록 상자가 있습니다. 모든 항목은 내부에 이미지 요소가있는 캔버스로 구성됩니다. 나는 이미지로 ManipulationEvents을 선언했다.이미지 요소에 대해 ManipulationDeltaEventArgs가 실행되지 않습니다. - WP8

<ListBox x:Name="CategoryLB" SelectionChanged="CategoryClicked" Margin="0,131,0,0"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Canvas Width='460' Height="130" Background="#FF0D6B97" Margin="10,10,10,10" > 
        <Image Width='480' Height="150" Source="{Binding Page}" Stretch="None" Opacity="1" CacheMode="BitmapCache" 
         ManipulationDelta="ImageManipulationDelta" 
         ManipulationCompleted="ImageManipulationCompleted" 
         ManipulationStarted="ImageManipulationStarted"/>   
      </Canvas> 
        </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 

문제는 ManipulationDelta 전혀 해고하지 않는 것입니다. ManipulationStartedManipulationCompleted 만 호출되고 내 애니메이션은 변환 값을 가져 오지 않습니다. 내게 똑바로 보인다.

이들은

은 ManipulationEvents 임 여기에없는

private void ImageManipulationStarted(object sender, ManipulationStartedEventArgs e) 
    { 
     FrameworkElement transformElement = ((FrameworkElement)sender) as FrameworkElement; 
     transformElement.SetHorizontalOffset(0); 
    } 

    private void ImageManipulationCompleted(object sender, ManipulationCompletedEventArgs e) 
    { 
     FrameworkElement transformElement = ((FrameworkElement)sender) as FrameworkElement; 

     if (Math.Abs(e.TotalManipulation.Translation.X) > transformElement.ActualWidth/3) 
     { 
      if (e.TotalManipulation.Translation.X < 0.0) 
      { 
       ToDoItemDeletedAction(transformElement); 
      } 
      else 
      { 
       ToDoItemCompletedAction(transformElement); 
      } 
     } 
     else 
     { 
      ToDoItemBounceBack(transformElement); 
     } 
    } 

    private void ImageManipulationDelta(object sender, ManipulationDeltaEventArgs e) 
    { 
     FrameworkElement transformElement = ((FrameworkElement)sender) as FrameworkElement; 

     // handle the drag to offset the element 
     double offset = transformElement.GetHorizontalOffset().Value + e.DeltaManipulation.Translation.X; 
     transformElement.SetHorizontalOffset(offset); 
    }  

아무것도입니까? 내가 이런 식 이미지 조작 .. 했을

답변

1

코드가 모든 권리이지만, 문제는 델타 이벤트가 에뮬레이터에서 실행되지 않으며 에뮬레이터와 장치 모두에서 코드를 테스트 한 결과 장치에 잘 작동하므로 걱정하지 말고 장치의 코드를 테스트하십시오.

+0

이 대답을 추가했습니다 ... –

0

내가 ..이 당신을 도울 수 eventhandlers에서 다음

<Image x:Name="imgViewer" CacheMode="BitmapCache" Source="/MetroImages/mapmetro.png" Stretch="Uniform"> 
          <Image.RenderTransform> 
           <ScaleTransform x:Name="scaleTrans" ScaleX="2" ScaleY="2" CenterX="150" CenterY="200" /> 
          </Image.RenderTransform> 
          <toolkit:GestureService.GestureListener> 
           <toolkit:GestureListener 
      PinchStarted="GestureListener_PinchStart" 
      PinchDelta="GestureListener_PinchDelta" 
      PinchCompleted="GestureListener_PinchComplete" 
        DragStarted="GestureListener_DragStart" 
      DragDelta="GestureListener_DragDelta" 
      DragCompleted="GestureListener_DragCompleted"/>         
          </toolkit:GestureService.GestureListener> 
         </Image> 

과 희망

private readonly DispatcherTimer m_animationTimer = new DispatcherTimer() { Interval = TimeSpan.FromMilliseconds(10) }; 
     private double _cx, _cy; 

     private void GestureListener_PinchStart(object sender, PinchStartedGestureEventArgs e) 
     { 
      Point p1 = e.GetPosition(imgViewer, 0); 
      Point p2 = e.GetPosition(imgViewer, 1); 

      scaleTrans.CenterX = (p1.X + ((p2.X - p1.X)/2)); 
      scaleTrans.CenterY = (p1.Y + ((p2.Y - p1.Y)/2)); 

      _cx = scaleTrans.ScaleX; 
      _cy = scaleTrans.ScaleY; 
     } 

     private void GestureListener_PinchDelta(object sender, PinchGestureEventArgs e) 
     { 
      // Compute new scaling factors 
      double cx = _cx * e.DistanceRatio; 
      double cy = _cy * e.DistanceRatio; 

      // If they're between 1.0 and 4.0, inclusive, apply them 
      if (cx >= 1.0 && cx <= 4.0 && cy >= 1.0 && cy <= 4.0) 
      { 
       if ((cy - 1) < 0.1 && (cx - 1) < 0.1) 
        cx = cy = 1; 

       scaleTrans.ScaleX = cx; 
       scaleTrans.ScaleY = cy; 
      } 
     } 

     private void GestureListener_PinchComplete(object sender, PinchGestureEventArgs e) 
     { 
     } 

     private void GestureListener_DragStart(object sender, DragStartedGestureEventArgs e) 
     { 
     } 

     private void GestureListener_DragDelta(object sender, DragDeltaGestureEventArgs e) 
     { 
      scaleTrans.CenterX = (scaleTrans.CenterX - e.HorizontalChange); 
      scaleTrans.CenterY = (scaleTrans.CenterY - e.VerticalChange); 

      if (scaleTrans.CenterX < 0) 
      { 
       scaleTrans.CenterX = 0; 
      } 
      else if (scaleTrans.CenterX > imgViewer.ActualWidth) 
       scaleTrans.CenterX = imgViewer.ActualWidth; 

      if (scaleTrans.CenterY < 0) 
      { 
       scaleTrans.CenterY = 0; 
      } 
      else if (scaleTrans.CenterY > imgViewer.ActualHeight) 
       scaleTrans.CenterY = imgViewer.ActualHeight; 
     } 

     private void GestureListener_DragCompleted(object sender, DragCompletedGestureEventArgs e) 
     { 
     } 
+1

GestureService가 WP8에서 사용되지 않으므로 dint는 툴킷으로 이동합니다. – alfah

+0

안녕하세요 @alfah 저는 여러분의 코드를 저에게 잘 보여 줬습니다 ... 조작 델타는 매번 호출됩니다. –

+0

에뮬레이터 또는 WP8 장치를 사용해 보셨습니까? – alfah

관련 문제