我希望从C#动态更改Silverlight ListBox的滚动位置,我需要知道如何从C#访问ListBox控件的ScrollViewer元素?
谢谢你们, 杰夫
答案 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()方法。
我也尝试过:
答案 4 :(得分:-1)
ScrollViewer scrollViewer = yourListBox.getScrollHost();
如果没有数据源设置到列表框,则为null,在我的情况下,只有在执行下面的代码后才能正确返回UI元素
myListBox.ItemsSource = list;