如何在Silverlight / C#中访问ListBox控件的ScrollViewer元素?

我希望从C#动态更改Silverlight ListBox的滚动位置,我需要知道如何从C#访问ListBox控件的ScrollViewer元素?

谢谢你们,杰夫

从inheritance自ListBox类的类中,您可以使用受保护的GetTemplateChild():

var myScrollviewer = myListBox.GetTemplateChild("ScrollViewer") as ScrollViewer;

如果要从ListBox外部访问它,那么通过属性公开ScrollViewer应该再次通过inheritance。

CAVEAT:如果您已设置自己的自定义模板,则此Scrollviewer可能不存在。 您可以在上面的方法中使用模板Scrollviewer名称而不是“ScrollViewer”。

好问题。 我没有找到直接做到这一点的方法,但是通过查看Silverlight Controls项目(他们在某些类中使用项目控件上的scrollviewer)非常接近。 以下是如何获取它,但它需要一个自定义列表框:

 public class TestBox : ListBox { private ScrollViewer _scrollHost; protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { var itemsHost = VisualTreeHelper.GetParent(element) as Panel; for (DependencyObject obj = itemsHost; obj != item && obj != null; obj = VisualTreeHelper.GetParent(obj)) { ScrollViewer viewer = obj as ScrollViewer; if (viewer != null) { _scrollHost = viewer; break; } } base.PrepareContainerForItemOverride(element, item); } } 

可能有另一种方法来挂钩该事件(或另一种方式来获取该面板),如果您查看ListBox的模板,您将看到滚动查看器实际上名为“ScrollViewer”,但GetTemplateChild方法受到保护,因此您仍然需要创建一个自定义类。

让我们轻松一下……在列表框模板中,您可能会找到ScrollViewer Control。 为它添加一个加载方法,你将自己从发送者arg。

 private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e) { myScrollViewer = (sender as ScrollViewer); } 

这对我有用

你可以打电话:

 myListBox.ApplyTemplate(); 

强制创建ListBox可视化树,否则如果您尝试立即访问它,GetTemplateChild()将返回Null。

这与“ Erno de Weerd ”解释很好地结合:inheritanceListBox以便能够调用GetTemplateChild()方法。

我也尝试过:

  • 使用ListBox扩展方法“GetScrollHost()”但它从来没有为我工作(即使在整页初始化后)。
  • “FindName()”,但它不起作用,即使我将ScrollViewer名称指定为ListBox模板。

Emmanuel(Silverlight 3)

 ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

如果没有数据集设置到列表框,则为null,在我的情况下,只有在执行下面的代码后才能正确返回UI元素

 myListBox.ItemsSource = list;