2010-03-08 51 views
46

Có ai có thể gợi ý hướng dẫn về thời điểm sử dụng SnapsToDevicePixels trong WPF 4.0 không?Khi nào tôi nên sử dụng SnapsToDevicePixels trong WPF 4.0?

Nó chỉ thỉnh thoảng được sử dụng nếu có vấn đề, tự do trong suốt một ứng dụng, chỉ trên một số điều khiển nhất định hay cái gì?

+3

Tôi thích nghĩ rằng các dòng sạch, sắc nét làm cho ứng dụng của bạn cảm thấy chuyên nghiệp và được cắt tỉa cẩn thận. Vì vậy, lời khuyên của tôi là sử dụng nó bất cứ nơi nào nó hỗ trợ mục tiêu đó. – cplotts

Trả lời

73

Câu trả lời hay của Spencer và Martin là khi để căn chỉnh pixel của bạn.

Đối với các cách: Tôi cũng sẽ chỉ ra rằng một trong WPF 4.0 nên thử sử dụng các tài sản UseLayoutRounding thay vì SnapsToDevicePixels.

UseLayoutRounding làm những gì bạn đang làm tương thích với Silverlight (SnapsToDevicePixels không có sẵn trong Silverlight) ... và Microsoft cũng đang khuyến khích việc sử dụng các UseLayoutRounding qua SnapsToDevicePixels trong documentation của nó.

Sự khác nhau giữa hai loại là gì? Vâng, một sự khác biệt lớn là UseLayoutRounding xảy ra trong giai đoạn bố trí trong khi SnapsToDevicePixels xảy ra trong giai đoạn hiển thị. Điều này làm cho tôi suy đoán rằng UseLayoutRounding có lẽ là một cách hiệu quả hơn để đi (tôi đã không xác nhận điều này, mặc dù).

Tất cả những gì được nói, vẫn sẽ có lý do để sử dụng SnapsToDevicePixels. Trong thực tế, tài liệu MSDN chỉ đến một. Tôi sẽ thêm một số khác: chỉ với SnapsToDevicePixels bạn có thể sử dụng các nguyên tắc để kiểm soát chính xác.

Dưới đây là một số tài nguyên về vấn đề này (tức làđiểm ảnh chụp và rõ ràng với hình ảnh, văn bản, và hình ảnh):

Heh. Tôi biết câu trả lời của tôi nhiều hơn một chút so với những gì bạn yêu cầu ... nhưng khái niệm này (tức là độ phân giải độc lập và các vấn đề mà nó mang lại và cách vượt qua chúng) thường có thể là một điểm của frustration khi làm việc với WPF. Ít nhất, tôi muốn chỉ cho bạn thuộc tính WPF 4.0 mới, UseLayoutRounding.

CẬP NHẬT

tôi chỉ phải thêm kể từ khi tôi đã thấy điều này hơn và hơn ... đôi khi SnapsToDevicePixels công trình khi UseLayoutRounding không. Tôi muốn tôi có thể đặt một ngón tay vào lý do tại sao đây là trường hợp, nhưng chắc chắn thử UseLayoutRounding đầu tiên và nếu điều đó không hoạt động, đừng ngần ngại thử SnapsToDevicePixels.

Dòng đó rất sắc nét nên nó có thể cắt bạn!

+0

More = Tốt hơn trong nhiều trường hợp, đây là một câu trả lời tuyệt vời cho nhiều câu hỏi tôi đã có, đặc biệt là vì tôi xin cảm ơn rằng tôi đã chuyển cổng WPF/LINQ sang SQL tốt hơn sang Silverlight/LINQ sang EF –

+0

Có thể SnapsToDevicePixels = true xuống WPF hiệu suất bằng cách nào đó? –

+1

@Peretz có lẽ không đáng chú ý ... nhưng việc bật tính năng này có thể thêm vào một số thứ phải được thực hiện/tính toán. Có lẽ hiệu ứng sẽ đáng chú ý nếu bạn có một tấn hình ảnh. Nhiều khả năng, mặc dù, các hit perf sẽ bị mất trong hiệu suất nói chung xấu. – cplotts

5

Một trường hợp là nếu bạn đang hiển thị hình ảnh hoặc video. Nếu bạn không chụp các pixel của thiết bị (ví dụ như pixel của màn hình video) thì một số thuật toán (nội suy, chống răng cưa) được sử dụng để định vị pixel của hình ảnh "ở giữa" pixel của màn hình và những gì được hiển thị sẽ không hiển thị tốt như hình gốc. Hình ảnh sẽ mất một số độ sắc nét.

8

Nó nên được sử dụng trên các điều khiển hoặc khu vực nơi vị trí của các điểm ảnh có ý nghĩa. Các điều khiển liên quan đến canvas của ứng dụng vẽ sẽ là một ví dụ. Bạn đã bao giờ thấy bản đồ của một ổ đĩa bị phân mảnh chưa? Đây có thể là một ví dụ khác.

Một ngoại lệ tôi có thể nghĩ đến là khi bạn đang sử dụng các đường phân cách thuộc loại nào đó. Trong khi hầu hết mọi người mong đợi các đường biên giới chắc chắn nếu cài đặt này tắt, chúng có thể trông mờ và mất tập trung.

Về cơ bản, nếu các cạnh mờ = xấu thì tắt nó đi.

+6

Bạn có thể có nghĩa là * "nếu các cạnh bị mờ - hãy bật nó lên" * (đặt 'SnapsToDevicePixels = true' để loại bỏ độ mờ). – Sinatr

1

Chỉ cần nhận thấy rằng nó rất hữu ích cho Biên giới. Thông tin bổ sung here.

<Style TargetType="Border" > 
     <Setter Property="SnapsToDevicePixels" Value="True" /> 
</Style> 
Các vấn đề liên quan