2014-07-06 2 views
2

Windows Phone 8 Silverlight 응용 프로그램에서 ViewportControl 클래스를 사용하여 핀치 앤 줌을 구현하는 동안 성공하지 못했습니다. 거기에 좋은 샘플이 있습니다. 예를 들어 this one과 같은데, 제가 찾은 예제를 내 시나리오에 매핑 할 수 없었습니다.Windows Phone : ViewportControl을 맞출 수 없습니다.

미세 조정 및 확대/축소가 잘 작동합니다. 문제는 조작이 완료된 후 뷰포트를 내용과 정렬하는 것입니다.

내가 직면 한 주요 문제는 조작이 완료된 후 뷰포트에 크기 조정 된 콘텐츠 (ViewportControl의 자식 인 XAML 캔버스와 하위 트리)를 정렬 할 수 없었습니다. 그 결과 뷰포트의 유효 범위 (스크롤 영역)가 내 콘텐츠에서 오프셋되어 내 콘텐츠의 일부가 연결할 수 없거나 스크롤 할 수 없게됩니다.

  1. 핀치 조작이 시작 :

    다음은 조작을위한 내 알고리즘이다.

  2. 핀치 동안 캔버스의 서브 트리에 렌더링 변환 적용.
  3. 조작이 완료되었습니다.
  4. 주 변환 캔버스의 유효 크기를 으로 바꿉니다 (예상대로 작동하고 캔버스가 렌더링 변환 된 하위 트리와 정렬 됨).
  5. ViewportControl 내부의 캔버스와 뷰포트 컨트롤 자체 사이에서 변환을 얻습니다.
  6. 변환을 사용하여 ViewportControl, 내에서 스크롤하려는 콘텐트를 오버레이하는 rect를 나타내는 바운딩 직사각형을 얻을 수 있지만 호스팅 ViewportControl의 좌표 공간에 있어야합니다.
  7. 이 rect를 ViewportControl의 뷰포트 범위로 적용하십시오.

    // Obtain transform between canvas and ViewportControl    
    GeneralTransform gt = m_MainCanvas.TransformToVisual(m_ViewportControl); 
    Rect newBounds = gt.TransformBounds(new Rect(0, 0, m_MainCanvas.Width, m_MainCanvas.Height)); 
    m_ViewportControl.Bounds = newBounds; 
    
    // set the origin of the viewport again 
    m_ViewportControl.SetViewportOrigin(gt.Transform(new Point(0, 0))); 
    

    이를 : 조작이 완료된 후 내가 계산하고 새로운 경계를 적용 할 경우

  8. 캔버스 여기

의 번역 왼쪽 상단 좌표에 뷰포트의 원점을 설정이다 내 콘텐츠가 뷰포트와 정렬되지 않습니다.

시도해보십시오. 내가 여기에서 잘못하고있는 것을 알아낼 수 없었습니다 ... 문제를 해결하는 방법을 보여주는 자습서를 본 후에도 ... : |

나는 무슨 일이 일어나고있는 지 알기 위해 경계를 설정하고있는 rect가 정확하게 크기가 정해져 있지만 X와 Y 좌표는 꺼져 있습니다. 캔버스와 ViewportControl 사이의 변환을 사용하여이 문제를 해결할 수 있기를 기대했지만 외관상으로는 아닙니다.

질문 : ViewportControl의 원점을 올바르게 설정하려면 어떻게해야합니까? (SetViewportOrigin 메서드에 전달할 점을 계산하는 방법은 무엇입니까?) 누군가가 배율이 조정 된 내용과 뷰포트간에 사용하는이 비율을 설명해 주실 수 있습니까? 나는

2014년 7월 8일 업데이트 내가 여기에 몇 가지 진전을 만들어?이 균열하는 방법의 다른 예에서 참조하십시오.ViewportControl의 컨텐트와 컨트롤 자체 사이의 변환을 얻은 다음 뷰포트의 경계로 사용할 컨트롤의 공간에서 rect를 얻기 위해이 메서드를 사용하면 작동하지 않습니다. 내 해결 방법은 렌더링 된 내용을 캔버스에 간단하게 래핑하여 효과적인 (렌더링 된 변형 된) 크기의 크기를 조정하는 것입니다. 그런 다음 그 크기로 경계를 설정하고 마침내 바운스 백 효과가 훌륭하게 작동했습니다.

내가 직면 한 문제는 캔버스의 크기를 조정하고 뷰포트 경계를 다시 설정하면 내용이 뷰포트의 왼쪽 위 모퉁이에 스냅되고 더 이상 핀치 영역 주위에 집중되지 않는다는 것입니다. 사용자가 제공 한

누구나 ViewportControl에서 SetViewportOrigin 메서드가 어떻게 작동하는지 이해할 수 있습니까? 내가 핀치 조작 후 캔버스 대 뷰포트에 대한 몇 가지 정말 이상한 데이터를보고 있어요 :

Canvas Size = 1025.69, 1641.11 
Bounds = 0,0,1025.69,1641.11 
viewport = -56,41.00,480,698 

왜 비 제로 값으로 오프셋 뷰포트입니다 (Y, X = -56,41) 때 돈 SetViewportOrigin (Point)도 호출하지 않습니까?

다음은 SetViewportOrigin (Point) 메서드가 어떻게 작동하는지 생각한 것입니다. 뷰포트 컨트롤의 크기가 400x400 픽셀이고 내용이 800x800 픽셀이라고 가정 해 봅시다. 뷰포트의 원점을 100, 100으로 설정하면 첫 번째 100 개의 세로 및 100 개의 가로 픽셀이 클리핑/마스크/오프 스크린 될 수 있도록 내용이 스크롤됩니다. 이것이 ViewportControl의 작동 방식이 아닙니까?

답변

0

나는 이것을 알아 냈고, 지금 행복한 야영 자다. 뷰포트 원점을 잘못된 좌표 공간을 사용하는 점으로 설정한다는 것이 밝혀졌습니다. 콘텐츠를 특정 장소로 ​​옮기고 싶다면 뷰 포인트의 좌표 공간에 그 점을 제공하고 콘텐츠는 스크롤 (콘텐츠의 왼쪽 상단 설정) 할 것이라고 생각했습니다. 내가 알아 낸 것은 SetViewportOrigin 메서드가 취하는 Point 데이터가 콘텐츠의 좌표 공간에 있다는 것입니다. 예를 들어 콘텐츠의 너비가 500x500 픽셀이고 뷰포트의 너비가 400x400 픽셀이고 첫 번째 100 개의 세로 및 100 개의 가로 픽셀을 뷰포트에서 마스킹하려는 경우 (예 : 콘텐츠)를 사용하면 원점을 -100,100이 아닌 100,100으로 설정합니다.

나는 좌표 공간 사이에서 쓸모없는 변환을하고 있었고 뷰포트에 좌표계를 전달하려고했습니다.

관련 문제