【发布时间】:2014-06-24 07:37:28
【问题描述】:
我希望创建一个滚动表面列表框,它会在拖动完成后自动捕捉到某个位置,以便屏幕上的中心项目在视口中居中。
我得到了中心项,但现在像往常一样 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 中使用定位的帮助。在这一点上,基于百分比的坐标和“屏幕单位”坐标之间的所有相关性和差异让我有些困惑。
【问题讨论】:
标签: wpf pixelsense