2008-11-04 71 views

回答

3

好問題。我沒有找到直接做這件事的方法,但是通過查看Silverlight控件項目(他們在一些類的項目控件上使用scrollviewer)來得相當接近。這裏是你如何能得到它,但它需要一個自定義列表框:

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方法受到保護,所以你仍然需要創建一個自定義類。

5

從從ListBox類繼承的類中,你可以使用受保護GetTemplateChild():

var myScrollviewer = myListBox.GetTemplateChild("ScrollViewer") as ScrollViewer;

如果你想從列表框外部訪問這個,然後通過一個露出的ScrollViewer財產應該繼續工作,通過繼承。

CAVEAT:如果您設置了自己的自定義模板,則此滾動查看器可能不存在。您可以在上述方法中使用模板Scrollviewer名稱而不是「ScrollViewer」。

+0

GetTemplateChild顯示是一個受保護的方法。這是新的嗎?因爲現在看來你的解決方案不再有效了。 http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx – 2011-03-10 21:56:13

-1
ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

爲空,如果沒有datasourse設置列表框,在我的情況下,它返回正確的UI元素下後才執行的代碼

myListBox.ItemsSource = list; 
0

您可以撥打:

myListBox.ApplyTemplate(); 

給力要創建ListBox可視化樹,否則GetTemplateChild()將立即返回Null,如果試圖立即訪問它。

此作品與「Erno de Weerd」結合得很好解釋:繼承ListBox可以調用GetTemplateChild()方法。

我也試過:

  • 使用列表框擴展方法「GetScrollHost()」,但它從來沒有爲我工作(即使整頁initialisations)。
  • 「FindName()」,但它不起作用,即使我將ScrollViewer名稱指定到ListBox模板中。

靈光(Silverlight 3中)

1

讓我們可以很容易... 在你的列表框模板,你可能會發現ScrollViewer控件。 爲它添加一個加載的方法,並且您將自己獲得發件人arg的身份。

private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     myScrollViewer = (sender as ScrollViewer); 
    } 

這對我的作品