6

I wish to dynamically change the scroll position of a Silverlight ListBox from C#, and I need to know how to access the ScrollViewer element of a ListBox control from C#?

Thanks guys, Jeff

4

5 回答 5

5

在从 ListBox 类继承的类中,您可以使用 Protected GetTemplateChild():

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

如果您想从 ListBox 外部访问它,那么通过 Property 公开 ScrollViewer 应该可以工作,再次通过继承。

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

于 2009-04-26T21:34:53.850 回答
3

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

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 方法受到保护,因此您仍然需要创建一个自定义类。

于 2008-11-05T22:21:37.033 回答
1

让我们让它变得简单... 在您的 Listbox 模板中,您可能会找到 ScrollViewer 控件。为其添加一个加载方法,您将从发送者 arg 中获取自身。

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

这对我有用

于 2012-10-13T17:45:21.593 回答
0

您可以致电:

myListBox.ApplyTemplate();

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

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

我也试过:

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

伊曼纽尔(银光 3)

于 2010-02-03T09:29:06.800 回答
-1
ScrollViewer scrollViewer = yourListBox.getScrollHost();

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

myListBox.ItemsSource = list;
于 2009-11-30T14:24:49.623 回答