Tôi đã làm việc này, với sự giúp đỡ của câu trả lời của Kiril ở trên. Ngữ cảnh chung của việc này là tôi có các biểu mẫu có thể xác định người dùng trong ứng dụng của tôi và mã này được sử dụng để hiển thị các điều khiển trên biểu mẫu.
Chiến lược chung của tôi là thêm điều khiển vào lưới, sau đó tìm tất cả các con của ScrollViewer bằng VisualTreeHelper và thêm bộ xử lý sự kiện GotFocus vào mỗi điều khiển.
Khi điều khiển được lấy nét, một lần nữa bằng cách sử dụng VisualTreeHelper, tôi tìm kiếm cây trực quan để tìm điều khiển có cha mẹ là lưới đang được cuộn bởi ScrollViewer. Sau đó, tôi cuộn ScrollViewer để hiển thị điều khiển.
Dưới đây là đoạn code (gridRender là Lưới rằng các điều khiển được thêm vào):
private void AfterFormRendered()
{
var controls = VisualTreeHelperUtil.FindChildren<Control>(gridRender);
foreach (var ctrl in controls)
{
ctrl.GotFocus += CtrlGotFocus;
}
}
private void CtrlGotFocus(object sender, RoutedEventArgs e)
{
var ctrl = sender as Control;
var gridChildControl = VisualTreeHelperUtil.FindParentWithParent(ctrl, gridRender) as FrameworkElement;
if (gridChildControl != null)
{
// Ensure the control is scrolled into view in the ScrollViewer.
GeneralTransform focusedVisualTransform = gridChildControl.TransformToVisual(scrollViewer);
Point topLeft = focusedVisualTransform.Transform(new Point(gridChildControl.Margin.Left, gridChildControl.Margin.Top));
Rect rectangle = new Rect(topLeft, gridChildControl.RenderSize);
double newOffset = scrollViewer.VerticalOffset + (rectangle.Bottom - scrollViewer.ViewportHeight);
scrollViewer.ScrollToVerticalOffset(newOffset);
}
}
Lưu ý: lớp VisualTreeHelperUtil là lớp của riêng tôi có thêm một số chức năng tìm kiếm hữu ích cho lớp VisualTreeHelper.
Nguồn
2009-08-04 20:34:32
Cảm ơn - với một sửa đổi nhỏ, mà tôi sẽ đăng là câu trả lời, nó hoạt động rất độc đáo. Phương thức TransformBounds trên GeneralTransform dường như là một điều SL3. –
Tôi biết đây là một bài đăng cũ, nhưng tôi đang cố gắng làm điều tương tự. Tôi đang sử dụng mã này nhưng giá trị Margin.Left và Margin.Top luôn là 0. – Jeremy