2008-11-04 23 views

Trả lời

3

Câu hỏi hay. Tôi đã không tìm thấy cách để làm điều đó trực tiếp, nhưng đến khá gần bằng cách nhìn vào dự án Silverlight Controls (họ sử dụng scrollviewer trên các mục điều khiển trong một số các lớp). Đây là cách bạn có thể lấy nó, nhưng nó đòi hỏi một ListBox tùy chỉnh:

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

Có thể có một cách khác để móc vào sự kiện đó (hoặc một cách khác để có được bảng đó), Nếu bạn nhìn vào khuôn mẫu cho ListBox bạn sẽ thấy trình xem cuộn thực sự có tên là "ScrollViewer", tuy nhiên phương thức GetTemplateChild được bảo vệ nên bạn vẫn cần phải tạo một lớp tùy chỉnh.

5

Từ bên trong một lớp kế thừa từ lớp ListBox, bạn có thể sử dụng GetTemplateChild bảo vệ():

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

Nếu bạn muốn truy cập từ bên ngoài ListBox, sau đó phơi bày ScrollViewer qua một Tài sản nên làm việc, một lần nữa thông qua thừa kế.

CAVEAT: Nếu bạn đã đặt mẫu tùy chỉnh của riêng mình thì Trình chỉnh sửa này có thể không tồn tại. Bạn có thể sử dụng tên mẫu Scrollviewer thay vì "ScrollViewer" trong phương thức trên.

+0

GetTemplateChild cho thấy là một phương pháp bảo vệ. Có phải mới không? bởi vì bây giờ có vẻ như giải pháp của bạn sẽ không hoạt động nữa. http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –

+0

Không chắc chắn, nhưng tôi đoán bạn sẽ phải tạo thuộc tính trên kế thừa lớp. Đây là những gì tôi đã làm cuối cùng nếu tôi nhớ chính xác; đó là một listview tùy chỉnh anyway. – Dann

+0

Điều này thực sự không hoạt động và không nên cố gắng. GetTemplateChild là một phương thức được bảo vệ. – Kevin

-1
ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

là null nếu không datasourse thiết lập để ListBox, trong trường hợp của tôi nó trở lại đúng UI tử chỉ sau khi bên dưới mã thực thi

myListBox.ItemsSource = list; 
0

Bạn có thể gọi:

myListBox.ApplyTemplate(); 

để buộc cây Visual ListBox được tạo ra, nếu không GetTemplateChild() sẽ trả về Null nếu bạn cố truy cập nó ngay lập tức.

Điều này hoạt động tốt kết hợp với giải thích "Erno de Weerd": ListBox kế thừa để có thể gọi phương thức GetTemplateChild().

Tôi cũng đã cố gắng:

  • sử dụng phương pháp mở rộng ListBox "GetScrollHost()", nhưng nó không bao giờ làm việc cho tôi (ngay cả sau khi initialisations trang đầy đủ).
  • "FindName()", nhưng nó không hoạt động, ngay cả khi tôi đã chỉ định tên ScrollViewer vào Template ListBox.

Emmanuel (Silverlight 3)

1

Hãy làm cho nó dễ dàng ... Trong mẫu Listbox của bạn, bạn có thể tìm Control ScrollViewer. Thêm phương thức được tải cho nó, và bạn sẽ tự lấy được từ người gửi arg.

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

này làm việc cho tôi

Các vấn đề liên quan