我创建了一个快速示例,将图像放入ScrollViewer中,启动DispatcherTimer,并每200毫秒打印出ScrollViewer.HorizontalOffset。从示例中我注意到一些奇怪的行为-如果我通过小幅度滚动60个像素左右来拖动图像,则HorizontalOffset值永远不会更改。 ScrollViewer是否无法正确报告其位置的原因是什么?
编辑:我还尝试了在ScrollViewer中抓取ScrollBar(命名为“HorizontalScrollBar”)并检查其Value属性,但结果相同。
编辑2:看来这个错误只发生在Mango build 7712上(即使应用程序构建为7.0)。我将关闭此功能,并希望在最终版本中修复此问题。
示例代码。在我的机器上,即使进行大范围的图像拖动,也没有更新。我似乎只在120个或更多值的增量中得到更新。我希望至少每10-20像素获得更新。
编辑:我还尝试了在ScrollViewer中抓取ScrollBar(命名为“HorizontalScrollBar”)并检查其Value属性,但结果相同。
编辑2:看来这个错误只发生在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;
}
}