我正在創建一個滾動的surfacelistbox,它在拖動完成後自動捕捉到一個位置,以便屏幕上的中心項目自己居中在視口中。捕捉SurfaceListBox
我已經得到了中心項目,但像往常一樣,WPF處理大小,屏幕位置和偏移量的方式讓我感到困惑。
目前我已經選擇訂閱SurfaceScrollViewer的ManipulationCompleted事件,因爲在完成滾動手勢(而ScrollChanged事件趨於提前觸發)後,這似乎始終如此。
void ManipCompleted(object sender, ManipulationCompletedEventArgs e)
{
FocusTaker.Focus(); //reset focus to a dummy element
List<FrameworkElement> visibleElements = new List<FrameworkElement>();
for (int i = 0; i < List.Items.Count; i++)
{
SurfaceListBoxItem item = List.ItemContainerGenerator.ContainerFromIndex(i) as SurfaceListBoxItem;
if (ViewportHelper.IsInViewport(item) && (List.Items[i] as string != "Dummy"))
{
FrameworkElement el = item as FrameworkElement;
visibleElements.Add(el);
}
}
int centerItemIdx = visibleElements.Count/2;
FrameworkElement centerItem = visibleElements[centerItemIdx];
double center = ss.ViewportWidth/2;
//ss is the SurfaceScrollViewer
Point itemPosition = centerItem.TransformToAncestor(ss).Transform(new Point(0, 0));
double desiredOffset = ss.HorizontalOffset + (center - itemPosition.X);
ss.ScrollToHorizontalOffset(desiredOffset);
centerItem.Focus(); //this also doesn't seem to work, but whatever.
}
該列表捕捉,但它捕捉的地方似乎有點混亂。我沿着屏幕的中心有一條線,有時它看起來正好在項目的中間,但有時候它偏離了一邊,甚至在項目之間。不能完全明白,但似乎列表的第一和第四四分位工作得很好,但第二和第三位逐漸向中心偏離。
只是尋找一些關於如何在WPF中使用定位的幫助。所有的相對性以及基於百分比的座標和「屏幕單位」座標之間的差異在這一點上讓我有些困惑。
你可以通過任何機會發布包含動畫的代碼嗎?謝謝。也感謝您爲您的問題提供答案。 – Sabuncu 2013-04-10 10:33:10
嗨Sabuncu,我剛剛添加了控件的完整代碼的pastebins。希望你會在那裏找到你需要的。請注意,它非常粗糙,其中一些特定於我的應用程序的目的,但我希望你能得到你所需要的。 – 2013-04-24 14:28:47
+2謝謝!將嘗試並報告。 – Sabuncu 2013-04-24 19:30:47