2013-07-17 3 views
0

Windows 8 저장소 응용 프로그램의 StackPanel에 draggable 요소가 있습니다. 내 목표는 간단합니다. 화면의 어딘가에 항목을 드래그하면 사용자가 드래그를 중지 한 직후 요소가 원래 시작 위치로 돌아갑니다. 작품의TranslateTransform은 Windows 8 저장소 응용 프로그램에서 다중 변환 후 요소를 너무 많이 상쇄합니다.

private void grdCover_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e) 
    { 
     Grid coverControl = sender as Grid; 
     double xOffset = -e.Cumulative.Translation.X; 
     double yOffset = -e.Cumulative.Translation.Y; 
     if (coverControl.RenderTransform is TranslateTransform) 
     { 
      TranslateTransform existingTransform = coverControl.RenderTransform as TranslateTransform; 
      existingTransform.X += xOffset; 
      existingTransform.Y += yOffset; 
     } 
     else 
     { 
      TranslateTransform transform = new TranslateTransform(); 
      transform.X = xOffset; 
      transform.Y = yOffset; 
      coverControl.RenderTransform = transform; 
     } 
    } 

코드 정렬 :

나는이 작업을 수행하기위한 것입니다 다음과 같은 코드가 있습니다. 화면은 응용 프로그램 시작시 다음과 같습니다

Initial screen showing the well aligned H and U elements

H가 아니라 내가 먼저 다시 점프 H 요소를 끌어 U.가 보이는 바닥 요소와 정렬과 같은 상위 요소, 잘 어울리는 위치에 놓이거나 최소한의 어긋남은 너무 적어 육안으로는 거의 감지 할 수 없습니다. I 드래그하고 이와 같은 더 많은 오정렬 얻는 H 소자 해제 계속 같이 15-20 드러그 H 소자 완전히 잘못 도착 이동

The H element is losing its original position

후을 :

The H element is completely misplaced

문제는 포인트 객체가 픽셀로 변환 될 때 이중 값의 반올림 오류로 인한 것일 수 있지만 이는 단지 추측에 불과합니다. 또한 내 PC와 같은 고해상도 장치의 경우 Visual Studio의 Windows 시뮬레이터와 같이 해상도가 낮은 것보다 눈에 띄게 표시되기 위해 더 많은 움직임이 필요합니다.

이 문제와 관련이있을 수 있습니다 일부 다른 코드 :

private void Grid_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e) 
    { 
     TranslateTransform translateTransform = (sender as Grid).RenderTransform as TranslateTransform; 
     translateTransform.X += e.Delta.Translation.X; 
     translateTransform.Y += e.Delta.Translation.Y; 
    } 

내가도에서 요소를 중지하는 대신에 다음과 같은 이벤트 핸들러를 가지고 : 나는 다음과 같은 코드로 드래그 작업을 수행

을 경우

private void grdCover_ManipulationInertiaStarting(object sender, ManipulationInertiaStartingRoutedEventArgs e) 
    { 
     e.TranslationBehavior.DesiredDeceleration = 10000000000000000; 
     e.Handled = true; 
    } 

당신은 내가 앉아야에 원하는 감속을 설정하고 싶었 궁금 : 사용자가 요소를 드래그 완료 후 화면에 너무 많은 이동 ble.Max는 화면에서 더 이상 "미끄러지는"움직임을 차단하지만 예외가 없다는 예외가 있습니다. 그래서 대신이 임의의 큰 값을 선택했습니다.

레이아웃 루트 나 이동 요소 또는 해당 컨테이너에 여분의 여백이나 패딩이 없습니다.

모든 아이디어를 환영합니다.

감사합니다. Andras

답변

0

좋아요.문제는 지점 사이에 약간의 불일치는 다음 코드 비트 좌표가 있다고 하였다 : 용액을

e.Delta.Translation.X 

의 값을 검색 하였다

TranslateTransform translateTransform = (sender as Grid).RenderTransform as TranslateTransform; 
translateTransform.X += e.Delta.Translation.X; 
translateTransform.Y += e.Delta.Translation.Y; 

double xOffset = -e.Cumulative.Translation.X; 
double yOffset = -e.Cumulative.Translation.Y;  

e.Delta.Translation.Y 

을 찾아서 해당 값을 xOffset 및 yOffset 변수에 할당합니다. 요소가 다시 잘못된 위치로 점프 유지 있도록

e.Cumulative.Translation.X 

e.Cumulative.Translation.Y 

의 값을 가져 오는 약간 다른 좌표를했다.