2015-06-22 5 views
0

Я пытаюсь получить ScrollViewer из моего свернутого ListBox. Это будет видно, и я попытался:Получение scrollviewer из Collapsed ListBox

-После Loaded событие:

 documentListBox.Loaded += (sender, e) => 
     { 
      var scroller = documentListBox.Template.FindName("Scroller", documentListBox); 
      var scroller1 = LogicalTreeHelper.GetParent(documentListBox); 
      var scroller2 = VisualTreeHelper.GetParent(documentListBox); 
      var scroller3 = Extensions.GetDescendantByType(documentListBox, typeof(ScrollViewer)) as ScrollViewer; 
      var scroller4 = documentListBox.Template.FindName("ScrollViewer", documentListBox) as ScrollViewer; 
     } 


     ----------------Extensions.GetDescendantByType:---------------- 
    public static Visual GetDescendantByType(Visual element, Type type) 
    { 
     if (element == null) 
     { 
      return null; 
     } 
     if (element.GetType() == type) 
     { 
      return element; 
     } 
     Visual foundElement = null; 
     if (element is FrameworkElement) 
     { 
      (element as FrameworkElement).ApplyTemplate(); 
     } 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) 
     { 
      Visual visual = VisualTreeHelper.GetChild(element, i) as Visual; 
      foundElement = GetDescendantByType(visual, type); 
      if (foundElement != null) 
      { 
       break; 
      } 
     } 
     return foundElement; 
    } 

-После IsVisibleChanged:

documentListBox.IsVisibleChanged+=VisibilityChanged 

    VisibilityChanged(){ 
      var scroller = Extensions.GetDescendantByType(documentListBox, typeof(ScrollViewer)) as ScrollViewer; 
      var scroller1 = documentListBox.Template.FindName("ScrollViewer", documentListBox) as ScrollViewer; 
      var scroller2 = VisualTreeHelper.GetParent(documentListBox); 
      var scroller3 = LogicalTreeHelper.GetParent(documentListBox); 
    } 

Также пытались переопределить ListBox и добавить это свойство в в обоих случаях:

 public ScrollViewer Scroller 
    { 
     get 
     { 
      return GetTemplateChild("ScrollViewer") as ScrollViewer; 
     } 
    } 

Все они либо дали мне что-то ng else или null. Любая идея о том, что звонить? Или где я мог бы получить к нему доступ.

ответ

-1

Нашел путем добавления нового шаблона:

 <ListBox.Template> 
     <ControlTemplate> 
      <ScrollViewer x:Name="Scroller"> 
       <VirtualizingStackPanel Orientation="Vertical" IsItemsHost="True"/> 
      </ScrollViewer> 
     </ControlTemplate> 
    </ListBox.Template> 

а затем переопределить OnRender в моем коде:

protected override void OnRender(DrawingContext dc) 
{ 
    base.OnRender(dc); 
    var scrollviewer = (documentListView.Template.FindName("Scroller", documentListView)) as ScrollViewer; 

также изменить параметры видимости:

Visibility="{Binding ViewIsVisible, Converter={Panels:BoolToVisibilityConverter}, FallbackValue=Visible}" 

Настройка это ложное значение в моей виртуальной машине привело к краху зрения, после того, как она была сделана.

Причина этого заключается в том, что ListBox/ListView не отображает их Template перед тем, как они станут видимыми (более эффективными).

Смежные вопросы