2014-07-06 37 views
2

我一直試圖在Windows Phone 8 Silverlight應用程序中使用ViewportControl類來實現捏和縮放相當長一段時間沒有任何成功。有一些很好的示例,例如this one,但我無法將我發現的示例映射到我的場景。Windows Phone:無法讓ViewportControl對齊

捏和縮放工作正常,我遇到的問題是在操作完成後視口與內容對齊。

我現在面臨的主要問題是,我的操作完成後,我一直無法對齊的縮放內容(一個XAML畫布和子樹,是ViewportControl的子級)對視。這會導致視口(可滾動區域)的有效範圍與我的內容偏移,導致部分內容無法訪問/無法解析。

這裏是我的操縱算法:

  1. 捏操作開始。
  2. 在夾點時應用渲染變換到畫布的子樹。
  3. 操作完成。
  4. 將主要畫布縮放爲 渲染轉換子樹的效果大小(此工作正常,畫布與渲染轉換的子樹對齊)。
  5. 獲取ViewportControl中的畫布和視口控件本身之間的轉換。
  6. 使用變換獲得一個邊界矩形(我期望)應該代表一個矩形,該矩形覆蓋了我想要在ViewportControl, 內但在託管ViewportControl的座標空間內滾動的內容。
  7. 將此矩形應用於ViewportControl的視口邊界。
  8. 將視區的原點到畫布

這裏的翻譯左上角座標是我計算和應用新的邊界,操作完成後:

// 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))); 

這導致我的內容與視口不一致。

嘗試,盡我所能,我一直無法弄清楚我在這裏做錯了什麼...即使在看了教程,顯示如何解決這個問題...:|

我認爲正在發生的事情是,我正在設置邊界的大小正確,但它的X和Y座標已關閉。我希望這可以通過使用畫布和ViewportControl本身之間的轉換來解決,但顯然不是。

問題:我如何正確設置ViewportControl的原點(我如何計算傳遞給SetViewportOrigin方法的點?是否有人可以解釋人們在縮放內容和視口之間使用的比例我在如何破解這個其他例子看?

2014年7月8日更新

我在這裏取得了一些進展。我在ViewportControl中的內容和控件本身之間獲得轉換的方法,然後使用它在控件空間中獲取用作視口邊界的矩形不起作用。我的解決方法是簡單地將渲染轉換後的內容封裝在調整有效(渲染變換)大小的畫布中。然後我將界限設置爲這個尺寸,並且我終於有了很好的反彈效果。

我現在面臨的問題是,當我調整畫布大小並重置視口的邊界時,內容會捕捉到視口的左上角,並且不再以夾點區域爲中心用戶提供。

任何人都可以幫助我瞭解SetViewportOrigin方法如何在ViewportControl上工作?我看到的視口與畫布一些非常奇怪的數據的捏操作之後:

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

爲什麼視非零值偏移(X,Y = -56,41)時,我不甚至不會調用SetViewportOrigin(Point)?

下面是我在考慮SetViewportOrigin(Point)方法的工作原理:假設我的Viewport控件本身大小爲400 x 400像素,我的內容爲800 x 800像素。如果我將視口的原點設置爲100,100,則內容將滾動,這樣前100個垂直像素和100個水平像素將被剪裁/屏蔽/離屏。這不是ViewportControl的工作原理嗎?

回答

0

我想通了,現在是一個快樂的露營者。事實證明,我正在使用錯誤的座標空間將視口原點設置爲一個點。我在想,如果我想將內容移動到某個地方,我會在視口的座標空間中提供該點,並且內容將滾動(設置內容的左上角點)。我想到的是,SetViewportOrigin方法所需的Point數據位於內容的座標空間中。例如:如果您的內容寬度爲500 x 500像素,則您的視口寬度爲400 x 400像素,並且您希望前端100個垂直像素和100個水平像素被視口遮擋(顯示視頻的右下角內容),您可以將原點設置爲100,100,而不是-100,100。

我在座標空間之間做了一堆無用的轉換,試圖通過視口在其座標系中的一個點。