2015-06-22 73 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