Хороший вопрос. Я не нашел способ сделать это напрямую, но пришел довольно близко, посмотрев проект Silverlight Controls (они используют scrollviewer для элемента управления в некоторых классах). Вот как вы можете получить его, но это требует пользовательского LISTBOX:
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 защищен, поэтому вам все равно нужно создать собственный класс.
GetTemplateChild показывает, что защищенный метод. Это новое? потому что теперь кажется, что ваше решение больше не будет работать. http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –
Не уверен, но я думаю, вам нужно будет создать свойство на наследующий класс. Это то, что я сделал в конце, если я правильно помню; в любом случае это был пользовательский список. – Dann
Это действительно не работает, и его не следует пытаться. GetTemplateChild - защищенный метод. – Kevin