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

Ytt*_*ium 6 c# silverlight listbox

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

谢谢你们,杰夫

Dan*_*ann 5

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

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

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

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


Bry*_*ant 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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