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

如何在Silverlight/C#中访问ListBox控件的ScrollViewer元素?,c#,silverlight,listbox,C#,Silverlight,Listbox,我希望从C#动态更改Silverlight ListBox的滚动位置,并且我需要知道如何从C#访问ListBox控件的ScrollViewer元素 谢谢各位, 杰夫:问得好。我没有找到直接执行的方法,但通过查看Silverlight控件项目(在某些类中,它们在items控件上使用scrollviewer),我已经非常接近了。以下是获取它的方法,但它需要一个自定义列表框: public class TestBox : ListBox { private ScrollViewer _scro

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

谢谢各位,
杰夫:问得好。我没有找到直接执行的方法,但通过查看Silverlight控件项目(在某些类中,它们在items控件上使用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);
    }
}

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

在从ListBox类继承的类中,您可以使用受保护的GetTemplateChild()

var myScrollviewer=myListBox.GetTemplateChild(“ScrollViewer”)作为ScrollViewer

如果您想从ListBox外部访问它,那么通过属性公开ScrollViewer应该也可以,同样是通过继承

警告:如果您已经设置了自己的自定义模板,那么这个Scrollviewer可能不存在。您可以使用模板Scrollviewer名称,而不是上述方法中的“Scrollviewer”

ScrollViewer scrollViewer = yourListBox.getScrollHost();
如果没有为listbox设置数据源,则为null,在我的示例中,它仅在执行下面的代码后返回正确的UI元素

myListBox.ItemsSource = list;
你可以致电:

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

这与“”解释:inherit ListBox结合使用,可以调用GetTemplateChild()方法

我还尝试:

  • 使用ListBox扩展方法“GetScrollHost()”,但它从未对我起作用(即使在整页初始化之后)
  • “FindName()”,但它不起作用,即使我在ListBox模板中指定了ScrollViewer名称
Emmanuel(Silverlight 3)

让我们轻松一点。。。 在Listbox模板中,您可能会找到ScrollViewer控件。 为它添加一个已加载的方法,您将从发送方arg获取它自己

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

这对我来说很有效

GetTemplateChild显示它是一种受保护的方法。这是新的吗?因为现在看来你的解决方案不再有效了。不确定,但我想您必须在继承类上创建一个属性。如果我没记错的话,这就是我最后所做的;无论如何,这是一个自定义列表视图。这实际上不起作用,不应尝试。GetTemplateChild是一个受保护的方法。我不明白为什么不应该尝试它。会痛吗?是的,它是一个受保护的方法,因此您可以在任何继承类中使用它。问题是您是否试图直接访问它。投票的另一个答案也是展示如何使用继承。我会更新我的2yo答案来安抚。上面的回答对我也不起作用。我在一次会议上再次提出了这个问题,并得到了一些其他的建议,这些建议确实有效。