2015-06-22 38 views
0

我很努力从我的折叠列表框中获取滚动查看器。 这将是可见的,我已经试过:从折叠列表框中获取滚动查看器

- 后加载的事件:

 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); 
    } 

还试图覆盖列表框,并添加该属性两种情况:

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

所有这些或者给我somethi 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