你需要得到所使用的ListBox
內部,所以你可以抓住VerticalOffset
屬性的值,然後調用SetVerticalOffset
方法ScrollViewer
的保持。
這要求您通過構成其內部的可視樹從ListBox
下來。
我用這個方便的擴展類,你應該添加到您的項目(我得把這個了一個博客,因爲我不停地重複它): -
public static class VisualTreeEnumeration
{
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root, int depth)
{
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i = 0; i < count; i++)
{
var child = VisualTreeHelper.GetChild(root, i);
yield return child;
if (depth > 0)
{
foreach (var descendent in Descendents(child, --depth))
yield return descendent;
}
}
}
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
{
return Descendents(root, Int32.MaxValue);
}
public static IEnumerable<DependencyObject> Ancestors(this DependencyObject root)
{
DependencyObject current = VisualTreeHelper.GetParent(root);
while (current != null)
{
yield return current;
current = VisualTreeHelper.GetParent(current);
}
}
}
有了這個可用ListBox
(和所有其他UIElements)獲得幾個新的擴展方法Descendents
和Ancestors
。我們可以將這些與Linq結合起來尋找東西。在這種情況下,您可以使用: -
ScrollViewer sv = SomeListBox.Descendents().OfType<ScrollViewer>().FirstOrDefault();
謝謝親切!我甚至沒有意識到控制系統的化妝可以通過這種方式進行導航。 – 2010-12-22 20:08:50
所以你怎麼知道什麼時候使用這些信息?如何知道它是從墓碑恢復而不是跳過一堆箍? – Roger 2011-06-12 23:01:28
@Roger:已閱讀此MSDN主題:http://msdn.microsoft.com/en-us/library/ff967548(v=VS.92).aspx – AnthonyWJones 2011-06-13 12:12:27