2012-09-28 40 views
5

Tôi đã tạo một ứng dụng Windows 8 Store bằng C#/XAML. Giao diện của tôi bao gồm danh sách cuộn, được hiển thị bằng cách sử dụng ScrollViewer. Tuy nhiên, tôi muốn có thể xử lý các sự kiện thao tác trên các phần tử trong danh sách, đặt ManipulationMode thành bất kỳ mục nào khác ngoài None trên phần tử danh sách khiến danh sách của tôi không còn cuộn nữa.ScrollViewer và xử lý các sự kiện thao tác trên các phần tử con

Đây là một phiên bản đơn giản của giao diện người dùng:

<ScrollViewer> 
    <Border/> <!-- these contain child content --> 
    <Border/> 
    <Border/> 
    <!-- Set ManipulationMode on an element in order to receive manipulation events --> 
    <!-- This causes the scroll viewer to stop working! --> 
    <Border ManipulationMode="All" 
      ManipulationDelta="..."/> 
    <Border/> 
    <Border/> 
</ScrollViewer> 

Tôi hiểu rằng WinRT ScrollViewer sử dụng một đặc biệt ManipulationMode của System vì lý do hiệu suất, nhưng tôi muốn có một danh sách cuộn theo chiều dọc, có chứa các yếu tố đó phản ứng với thao tác/cử chỉ ngang. Bất cứ ai có thể nghĩ ra một cách giải quyết sáng tạo mà có thể làm cho điều này có thể?

Trả lời

8

Những gì tôi đã làm là tôi đặt một hình chữ nhật trong suốt trên đầu trang của ScrollViewer và xử lý các thao tác ở đó. Khi tôi tìm thấy thao tác nên cuộn ScrollViewer - tôi cuộn ScrollViewer bằng cách sử dụng các phương thức ScrollToHorizontal/VerticalOffset(). Trên ManipulationStarted tôi cũng sử dụng VisualTreeHelper.FindElementsInHostCoordinates để kiểm tra mục nào tôi có thể thao tác quá và sau đó tôi có thể quyết định có nên thao tác với mục đó hay không tùy thuộc vào các điều kiện khác nhau. Đó là khá một chút mã tùy chỉnh mặc dù. Bạn cũng sẽ cần cập nhật RenderTransform của ScrollContentPresenter trong ScrollViewer khi người dùng cố gắng kéo xa hơn tối thiểu/tối đa bù đắp để immitate hành vi mặc định ScrollViewer, xử lý con lăn scrollwheel vv Không có gì BẠN không thể xử lý tất nhiên. Tôi không thể tìm thấy một cách tốt hơn không may và tôi quan tâm nếu ai đó tìm thấy một.

EDIT * Một giải pháp khác mà tôi nghĩ khi cố gắng trả lời another similar question là sử dụng một ScrollViewer khác làm mục con và sử dụng các sự kiện ViewChanged thay vì thao tác sự kiện.

EDIT 2 *

Ngoài ra với Windows 8.1 bạn có được ManipulationModes.System mà kết hợp với chế độ khác nên cho phép bạn xử lý các thao tác bên trong một ScrollViewer. Sau đó, bạn có thể gọi CancelDirectManipulations() trên phần tử được thao tác khi bạn muốn phụ huynh của nó ScrollViewers để ngừng xử lý thao tác cho pan & zoom.

+0

Wow - đó là rất nhiều công việc. Vì vậy, về cơ bản bạn có thể tự cuộn bản thân 'ScrollViewer'? Điều này có nghĩa là bạn cũng phải thực hiện các phép tính quán tính của riêng bạn sao cho nó tự động cuộn? Hay nó tự động làm điều này khi bạn thay đổi bù đắp dọc? – ColinE

+1

Thao tác trong Jupiter có tính năng quán tính tích hợp được bật theo mặc định, do đó bạn sẽ được bảo vệ. Bạn chỉ cần chắc chắn rằng bạn không squish ScrollContentPresenter ở cuối danh sách nếu di chuyển xảy ra do quán tính. Các thao tác thường khá trơn tru, nhưng bạn có thể sử dụng các hình động của ScrollViewer như các công cụ từ [WinRT XAML Toolkit] (http://bit.ly/WinRTXamlToolkit) để làm mượt cuộn khi sử dụng bánh xe cuộn. BTW, tôi quên đề cập đến bạn cũng có thể muốn xử lý tập trung vào các mục khi bạn chạm vào lớp phủ ... :) –

+1

@ColinE kiểm tra câu trả lời của tôi cho [câu hỏi này] (http: // stackoverflow.com/questions/14153038/how-to-allow-manipulations-trong-listview-gridview-item-controls-while-allow/14161596 # 14161596) cho giải pháp khác. –

10

có thể mất nhiều thời gian nhưng không tìm thấy giải pháp tốt nào. Tôi chỉ đạt được những gì tôi muốn rất dễ dàng.

public MovableGrid() 
     { 
      ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.System; 
      AddHandler(ManipulationDeltaEvent, new ManipulationDeltaEventHandler(UIElement_OnManipulationDelta), true); 
      AddHandler(ManipulationCompletedEvent, new ManipulationCompletedEventHandler(UIElement_OnManipulationCompleted), true); 
     } 

Tôi muốn MovableGrid được di chuyển trên trục X và tôi có danh sách MovableGrids mà tôi muốn được cuộn bằng scrollviewer. Thế là đủ để làm điều đó.

+0

Cảm ơn bạn! Đây chính xác là những gì tôi cần! – Pam

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