2013-02-13 1 views
1

Я пытаюсь получить доступ к ScrollViewer с именем «ScrollViewerItems» в XAML ниже и использовать его в коде позади. Имя, похоже, не распознается, вероятно, потому, что оно встроено в ItemsControl. Мне не нужен именованный доступ, но как мне добраться до элемента ScrollViewer ItemsControl в коде?Как получить доступ к ScrollViewer в ItemsControl

<ItemsControl x:Name="EnteredItemsView" ItemsSource="{Binding LineItems}" VirtualizingStackPanel.IsVirtualizing="True" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.Template> 
     <ControlTemplate> 
      <ScrollViewer x:Name="ScrollViewerItems" Focusable="False"> 
       <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <ItemsControl.ItemTemplate> 
    ... 
+0

вы можете использовать визуальный помощник дерева или может или запрос на templatedchild – JSJ

ответ

3

ScrollViewer является визуальным потомком ItemsControl:

var scrollViewer = 
    VisualTreeHelper.GetChild(EnteredItemsView, 0) as ScrollViewer; 

Обратите внимание, что ItemsControl должен быть загружен, прежде чем вы можете получить доступ к ребенку.

Вы можете добавить Loaded обработчик к ItemsControl

<ItemsControl Loaded="ItemsControlLoaded" ...> 

где вы получаете доступ к ScrollViewer

private void ItemsControlLoaded(object sender, EventArgs e) 
{ 
    var itemsControl = sender as DependencyObject; 
    var scrollViewer = 
     VisualTreeHelper.GetChild(itemsControl, 0) as ScrollViewer; 
} 
+0

Указанный индекс находится вне диапазона или дочерний индекс в индексе - null. Не вызывайте этот метод, если VisualChildrenCount возвращает ноль, указывая, что у Visual нет дочерних элементов. EnteredItemsView.VisualChildrenCount был 0 FYI – kenny

+0

Вы вызвали GetChild перед загрузкой ItemsControl! См. Мое редактирование. – Clemens