我創建了一個快速示例,將圖像放置在ScrollViewer中,啓動DispatcherTimer,然後每200 ms打印一次ScrollViewer.HorizontalOffset。從這個例子中,我注意到了一些奇怪的行爲 - 如果我抓住圖像並少量滾動,例如60像素左右,HorizontalOffset值永遠不會改變。 ScrollViewer沒有正確報告其位置的原因是什麼?編輯:我也嘗試抓住ScrollViewer中的ScrollBar(名爲「HorizontalScrollBar」)並檢查其Value屬性,但我得到了相同的結果。Windows Phone 7 ScrollViewer.HorizontalOffset不更新
EDIT2:看來這個bug只發生在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;
}
}
請注意如何獲得偏移量(代碼)?我剛剛構建了一個快速示例,它似乎工作正常。 –
我剛剛測試過你的代碼,它對我來說工作正常。延遲可能是由您拍攝快照的方式引起的。介意分享嗎? –
Hi Dennis - 快照代碼是上面的「Debug.WriteLine()」。當你運行該樣本時,你是否說它幾乎在每個像素處都會更新?我只能每80-120像素更新一次。 –