2010-01-13 37 views
6

Tôi muốn hiểu các yêu cầu chung đối với bố cục WPF/Silverlight để có thể thực hiện các tính năng zoom (kéo và thu phóng) pan &. Tôi không có nghĩa là pan & thu phóng hình ảnh nhưng với bố cục tổng cộng (cửa sổ) (hoặc một phần của nó) bằng một số điều khiển.Các điều khiển xoay và thu phóng WPF và Silverlight và bố cục

Tính năng nào của bố cục và các tính năng của các điều khiển tùy chỉnh được sử dụng làm bố cục cố định và không thể thu phóng pan &?

Trả lời

9

Nguyên tắc chung

Với vài ngoại lệ, tất cả mọi thứ trong WPF có thể được trích gay gắt, thu nhỏ, xoay, kéo dài, vv với nội dung trái tim của bạn. Điều này bao gồm các điều khiển đơn như Nút, điều khiển hợp chất như ListBox và các vùng chứa như StackPanel.

Các trường hợp ngoại lệ

Dưới đây là những trường hợp ngoại lệ:

  1. Nếu bạn đang sử dụng adorner và AdornerDecorator của bạn là ngoài khu vực gay gắt/thu nhỏ, sau đó các Adorners gắn liền với khu vực gay gắt/thu nhỏ của bạn sẽ xoay nhưng không phóng to. Giải pháp là đặt một AdornerDecorator bổ sung bên trong khu vực được quét/thu phóng.

  2. Nếu bạn sử dụng Cửa sổ bật lên, nó sẽ hiển thị ở vị trí được quét/thu phóng của Vị trí nhắm mục tiêu theo vị trí đã được thu phóng hoặc nó sẽ không được thu nhỏ. Nó cũng sẽ không di chuyển khi bạn xoay vùng chứa mục tiêu vị trí của nó (về cơ bản nó nằm trong bề mặt riêng của nó phía trên điều khiển đích). Để giải quyết vấn đề này, hãy sử dụng Canvas có kích thước bằng không với thứ tự Z cao thay vào đó khi bạn muốn thứ gì đó bật lên trong vùng thu phóng/pan.

  3. Bất kỳ bối cảnh nào bạn xác định sẽ được hiển thị bên trong cửa sổ bật lên, vì vậy các mục menu sẽ hiển thị kích thước bình thường ngay cả khi khu vực bạn nhấp vào được phóng to hoặc thu nhỏ. Bởi vì bản chất của một menu ngữ cảnh, đây có lẽ là hành vi mong muốn. Nếu không, bạn có thể bọc các mục menu trong ViewBox và buộc thu phóng vào thu phóng của khu vực chính.

  4. Chú giải công cụ của bạn sẽ hiển thị kích thước bình thường ngay cả khi giao diện người dùng được quét hoặc thu phóng. Cùng một giải pháp cho ContextMenu.

  5. Nếu bạn sử dụng tích hợp WinForms để tích hợp điều khiển WinForms kế thừa và giao diện người dùng, họ sẽ không đúng cách xoay, thu phóng và clip trong các tình huống nhất định. Có một kỹ thuật tiên tiến để làm việc xung quanh, nơi bạn thực hiện điều khiển WinForms ngoài màn hình, sau đó sử dụng BitBlt hoặc sao chép hình ảnh tương tự vào cửa sổ của bạn dưới dạng hình ảnh và chuyển tiếp các lần nhấp chuột và tổ hợp phím đến cửa sổ ngoài màn hình. Đây là rất nhiều công việc, mặc dù.

  6. Nếu bạn bỏ qua WPF và trực tiếp sử dụng GDI + hoặc DirectX hoặc sử dụng Win32 hWnds để hiển thị nội dung hoặc giao diện người dùng, nội dung hoặc giao diện người dùng đó sẽ không được rập, thu nhỏ hoặc cắt bớt cửa sổ trừ khi bạn tự làm điều đó trong giao diện của mình mã.

ghi chú cuối cùng

  • Một WPF UI tốt luôn luôn sử dụng các tấm như Grid, DockPanel, vv để bố trí điều khiển một cách linh hoạt để họ tự động điều chỉnh kích thước container, thay vì sử dụng kích thước cố định và vị trí. Điều này cũng đúng đối với nội dung bên trong của vùng pan/zoom của bạn, NHƯNG có ngoại lệ đối với quy tắc này: phần tử ngoài cùng trong vùng pan/zoom của bạn phải có kích thước được chỉ định. Nếu không thì điều gì sẽ xác định khu vực đang được quét/thu phóng?

  • Cách dễ dàng để thực hiện khả năng xoay/thu phóng là điều chỉnh RenderTransform của điều khiển ngoài cùng trong vùng pan/zoom của bạn. Có nhiều cách khác nhau để thực hiện điều khiển xoay và thu phóng, ví dụ: bạn có thể sử dụng các nút và thanh trượt trên thanh công cụ, thanh cuộn, bánh xe chuột, phím cách + kéo để di chuyển, vùng có thể kéo của giao diện người dùng được quét hoặc bất kỳ kết hợp nào trong số này. Cho dù bạn chọn giao diện nào, chỉ cần cập nhật giao diện RenderTransform một cách thích hợp từ mã phía sau và bạn tốt để đi.

  • Nếu cơ chế panning bạn chọn là thanh cuộn, bạn có thể muốn sử dụng ScrollViewer và chỉ sử dụng RenderTransform để thu phóng.

  • Đảm bảo bạn đặt cắt trên vùng pan/zoom. Nếu không, nếu bạn phóng to hoặc xoay các mục ở bên cạnh, chúng sẽ vẫn hiển thị bên ngoài vùng pan/zoom.

+0

Ray, Cảm ơn bạn đã dành thời gian và nỗ lực đưa ra câu trả lời chi tiết như vậy. +1 – rem

+0

'' Có ​​một kỹ thuật nâng cao để thực hiện việc này, nơi bạn thực hiện điều khiển WinForms ngoài màn hình, sau đó sử dụng BitBlt hoặc sao chép hình ảnh tương tự vào cửa sổ dưới dạng hình ảnh và chuyển tiếp các lần nhấp chuột và tổ hợp phím đến cửa sổ ngoài màn hình Đây là rất nhiều công việc, mặc dù. "' Bạn có bất kỳ tham chiếu nào về những người đã thực hiện việc này không? Cơ chế chuyển tiếp sự kiện, đặc biệt, có vẻ phức tạp. –

+0

@Russell: Tôi đã từng thử một số mã đã làm điều này, nhưng tôi đã không viết nó bản thân mình và tôi không biết bất cứ nơi nào trực tuyến, bạn có thể tìm thấy một ví dụ về nó. Tôi nhớ mã chuyển tiếp sự kiện đã đăng các tin nhắn WM_ mức thấp đơn giản, ví dụ: WM_LBUTTONDOWN, WM_MOUSEMOVE, WM_KEYDOWN, v.v. –

1

Một cách thực hiện dễ dàng để thực hiện phóng to XAML là sử dụng Hộp xem Silverlight. Điều này thu phóng XAML không phải là pixel. Bạn có thể chỉ định khoảng thời gian sử dụng và ViewBox sẽ mở rộng dựa trên điều này (Fill, None, Uniform etc). Có một số bài đăng trên blog Viewbox tuyệt vời trên web nếu bạn tìm kiếm Silverlight + Viewbox trên Google.

Việc quét dễ dàng thực hiện với cơ chế tương tự để kéo và thả và cũng có rất nhiều bài đăng trên blog về điều này, có sẵn thông qua Google. Chỉ số tiền để nắm bắt các sự kiện MouseDown, MouseMove và MouseUp.

3

Sử dụng một khu vực MultiScaleImage hoặc Canvas, và đặt mọi thứ bạn cần phải xoay và phóng to nó

<Canvas x:Name="panZoomPanel" Background="Transparent"> 
</Canvas> 

Trong sử dụng mã làm cho một TranslateTransform và một ScaleTransform trong một TransformGroup xoay và thu phóng

Kiểm tra ra khác SO post hoặc điều này example hoặc this one

2

Nói chung, bạn có thể xử lý bất kỳ tập hợp các yếu tố giao diện người dùng nào giống như bạn sẽ đối xử với một UIElement đơn lẻ để của một hình ảnh không thực sự khác với việc làm tương tự cho toàn bộ ứng dụng. Cách tốt nhất để xử lý việc phóng to dựa trên đầu vào của người dùng (trái với quy mô tự động mà Viewbox làm) đang áp dụng một ScaleTransform. Điều này có thể được đặt trên một phần tử cấp cao, giống như một Grid ở gốc của bố cục Window. Đối với panning bạn có thể kết hợp trong một TranslateTransform hoặc trong một số trường hợp sử dụng một ScrollViewer để xử lý việc di chuyển khung nhìn của nội dung.

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