Windows Phone 7 ScrollViewer.HorizontalOffset 未更新
我创建了一个快速示例,将图像放入 ScrollViewer 中,启动 DispatcherTimer,然后每 200 毫秒打印出 ScrollViewer.HorizontalOffset。从示例中我注意到一些奇怪的行为 - 如果我抓取图像并滚动少量(例如 60 像素左右),HorizontalOffset 值永远不会改变。 ScrollViewer 未正确报告其位置是否有原因?
编辑:我还尝试抓取 ScrollViewer 中的 ScrollBar (名为“HorizontalScrollBar”)并检查其 Value 属性,但得到相同的结果。
EDIT2:看来这个错误只发生在 Mango build 7712 上(即使该应用程序是为 7.0 构建的)。我将结束这个并希望它在最终版本中得到修复。
示例代码。在我的机器上,我可以将图像拖动很大范围而无需更新。我似乎只获得 120 左右增量的更新。我希望至少每 10-20 像素更新一次。
<Grid x:Name="LayoutRoot" Background="Transparent">
<ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" x:Name="Scroll">
<Image Source="Jellyfish.jpg" Stretch="None"/>
</ScrollViewer>
</Grid>
MainPage.xaml.cs:
// Constructor
public MainPage()
{
InitializeComponent();
this.Loaded += (s, e) =>
{
var scrollBar = Scroll.FindVisualChild("HorizontalScrollBar") as ScrollBar;
scrollBar.ValueChanged += (s1, e1) => Debug.WriteLine(DateTime.Now + " " + scrollBar.Value);
};
}
ExtensionMethods.cs:
public static class ExtensionMethods
{
public static FrameworkElement FindVisualChild(this FrameworkElement root, string name)
{
FrameworkElement temp = root.FindName(name) as FrameworkElement;
if (temp != null)
return temp;
foreach (FrameworkElement element in root.GetVisualDescendents())
{
temp = element.FindName(name) as FrameworkElement;
if (temp != null)
return temp;
}
return null;
}
public static IEnumerable<FrameworkElement> GetVisualDescendents(this FrameworkElement root)
{
Queue<IEnumerable<FrameworkElement>> toDo = new Queue<IEnumerable<FrameworkElement>>();
toDo.Enqueue(root.GetVisualChildren());
while (toDo.Count > 0)
{
IEnumerable<FrameworkElement> children = toDo.Dequeue();
foreach (FrameworkElement child in children)
{
yield return child;
toDo.Enqueue(child.GetVisualChildren());
}
}
}
public static IEnumerable<FrameworkElement> GetVisualChildren(this FrameworkElement root)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
yield return VisualTreeHelper.GetChild(root, i) as FrameworkElement;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不频繁的滚动事件更新是 Mango 性能改进的一部分:
http://blogs.msdn.com/b/slmperf/archive/2011/06/02/listbox-scrollviewer-performance-improvement-for-mango-and-how-it-impacts-your- existing-application.aspx
修复方法是更改 ScrollViewer 的 ManipulationMode,如下所示:
The infrequent scroll event updating is part of the performance improvements in Mango:
http://blogs.msdn.com/b/slmperf/archive/2011/06/02/listbox-scrollviewer-performance-improvement-for-mango-and-how-it-impacts-your-existing-application.aspx
The fix is to change the ScrollViewer's ManipulationMode as follows:
我有使用scrollviewer和horizontalOffset的经验,你可以将你的开发工具更新到beta2以使其正常工作(就我而言,scrollviewer是beta中的一个已知错误)。如果仍然没有运气,请尝试我的代码(对我有用):
I have experienced with scrollviewer and horizontalOffset, you may update your developer tool to beta2 to have it working (it was in my case, scrollviewer is a known bug in beta). If it's still no luck, try my code (work for me):