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.
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 –
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
Đ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