2009-09-03 22 views
7

Tôi có một ItemsControl trong một ScrollViewer. Các mục trong số ItemsControl được mở rộng thành DataTemplate, về cơ bản bao gồm một số Adorner.WPF Adorner Clipping

Bây giờ vấn đề là, khi cuộn, Hình ảnh trực quan của Adorner hiển thị bên ngoài ScrollViewer. Cho phép nói rằng tôi di chuyển từ Horizontal Offset 0 đến 100, Visual Children của di chuyển Adorner sang trái và có thể nhìn thấy bên cạnh ScrollViewer, mặc dù chúng sẽ bị ẩn. Đặt ClipToBounds trên ItemsControl hoặc ScrollViewer không hoạt động.

Tôi hiểu rằng Adorner được hiển thị trên tất cả các yếu tố z-order khôn ngoan, nhưng chúng thực sự không được hiển thị trong các trường hợp như với ScrollViewer. Các trang trí Element bằng cách cư xử như mong đợi và không thể nhìn thấy thông qua các ScrollViewer.

Có cách nào dễ dàng để "kẹp" Adorner s để chúng chỉ hiển thị trong vùng cuộn có thể nhìn thấy không?

Cảm ơn, Andrej

+2

Phiên bản .NET/WPF nào đã xảy ra với bạn? Tôi thực sự đang cố gắng tái tạo hành vi này và tôi không thể. Về cơ bản, tôi muốn trang bị lỗi của tôi hiển thị qua các giới hạn của scrollviewer (không sử dụng cửa sổ bật lên) –

Trả lời

2

Tôi đã gặp phải vấn đề tương tự khi subclassing WPFToolkit DataGrid để vẽ một adorner xung quanh ô hiện hành.

Nội dung của ScrollViewer được hiển thị bởi một thể hiện ScrollContentPresenter. ScrollContentPresenter có lớp adorner riêng, có thể truy cập thông qua thuộc tính ScrollContentPresenter.AdornerLayer.

Tôi thấy rằng adgar của tôi đúng clip nếu tôi thêm nó vào lớp đó.

+0

Làm thế nào để bạn lấy được ScrollContentPresenter từ mã? – stone

+0

Tôi sử dụng VisualTreeHelper để tìm kiếm cây thị giác cho đến khi tôi tìm thấy một hậu duệ của loại ScrollContentPresenter. Hãy xem phương pháp trong chủ đề này - http://wpf.codeplex.com/Thread/View.aspx?ThreadId=34542. – hwiechers

5

Đặt ClipToBounds trên điều khiển chứa là không đủ. Bạn cũng phải đặt thuộc tính IsClipEnabled của adorner.

0

giải pháp của tôi là để đẩy một vùng clip vào bối cảnh vẽ, làm bất cứ điều gì tôi cần, và pop clipping ở cuối, như thế này:

drawingContext.PushClip(new RectangleGeometry(new Rect(0, 0, this.AdornedElement.RenderSize.Width, this.AdornedElement.RenderSize.Height))); 
// continue drawing 
drawingContext.Pop(); 

Bạn có thể cắm này ở vào bất kỳ adorner, các giới hạn đã có sẵn như một phần của phần tử.