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

时间:2008-11-04 21:23:04

标签: c# silverlight listbox

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

谢谢你们, 杰夫

5 个答案:

答案 0 :(得分:5)

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

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

如果要从ListBox外部访问它,那么通过属性公开ScrollViewer应该可以继续使用。

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

答案 1 :(得分:3)

好问题。我没有找到直接做到这一点的方法,但是通过查看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方法是受保护,因此您仍然需要创建自定义类。

答案 2 :(得分:1)

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

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

这对我有用

答案 3 :(得分:0)

您可以致电:

myListBox.ApplyTemplate();

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

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

我也尝试过:

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

答案 4 :(得分:-1)

ScrollViewer scrollViewer = yourListBox.getScrollHost();

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

myListBox.ItemsSource = list;