[英]Windows Phone: Can't get ViewportControl to align
我一直在嘗試使用Windows Phone 8 Silverlight應用程序中的ViewportControl類來實現縮放功能,但沒有成功。 有一些偉大的樣品在那里,如這一個 ,但我一直沒能來,我發現我的情況的實例映射。
捏合和縮放效果很好,操作完成后,我遇到的問題是視口與內容的對齊方式。
我面臨的主要問題是,在完成操作后,我無法將縮放后的內容(XAML畫布和子樹是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)));
這導致我的內容與視口未對齊。
嘗試,盡我所能,即使在看了顯示如何解決這個問題的教程之后,我也無法弄清楚我在做什么錯...
我認為正在發生的事情是我將邊界設置為的矩形大小正確,但是X和Y坐標已關閉。 我希望可以通過使用畫布和ViewportControl本身之間的轉換來解決此問題,但顯然不是。
問題:如何正確設置ViewportControl的原點(如何計算傳遞給SetViewportOrigin方法的點?有人可以解釋人們在縮放內容和我在其他視圖中看到的視口之間使用的比例嗎?實例如何破解呢?
2014年7月8日更新
我在這里取得了一些進展。 我的方法是在ViewportControl的內容和控件本身之間進行轉換,然后使用它在控件的空間中獲取一個rect作為視口的邊界,這種方法不起作用。 我的解決方法是將渲染轉換后的內容簡單地包裝在畫布中,然后調整有效(渲染轉換)大小。 然后,將邊界設置為該大小,然后終於有了不錯的反彈效果。
我現在面臨的問題是,當我調整畫布的大小並重置視口的邊界時,內容會捕捉到視口的左上角,而不再以用戶提供的收縮區域為中心。
誰能幫助我了解SetViewportOrigin方法如何在ViewportControl上工作? 經過捏捏操作后,我看到了視口和畫布的一些非常奇怪的數據:
Canvas Size = 1025.69, 1641.11
Bounds = 0,0,1025.69,1641.11
viewport = -56,41.00,480,698
當我什至不調用SetViewportOrigin(Point)時,為什么視口偏移具有非零值(x,y = -56,41)?
這是我在想SetViewportOrigin(Point)方法的工作方式:假設我的Viewport控件本身的大小為400 x 400像素,而我的內容為800 x 800像素。 如果將視口的原點設置為100,則將滾動100,將滾動內容,以使前100個垂直像素和100個水平像素被剪切/遮罩/屏外。 這不是ViewportControl的工作方式嗎?
我想通了,現在是一個快樂的露營者。 原來,我是使用錯誤的坐標空間將視口原點設置為一個點。 我當時在想,如果我想將內容移動到某個位置,則可以在視口的坐標空間中提供該點,然后內容就會滾動(設置內容的左上角)。 我發現,SetViewportOrigin方法獲取的Point數據位於內容的坐標空間中。 例如:如果您的內容為500 x 500像素寬,則視口為400 x 400像素寬,並且您希望前100個垂直像素和100個水平像素被視口遮蓋(顯示該像素的右下角內容),則可以將原點設置為100,100,而不是-100,100。
我在坐標空間之間進行了一堆無用的轉換,試圖將視口傳遞到其坐標系中的一個點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.