2011-02-06 24 views
6

Lớp System.Drawing.Graphics có thuộc tính CompositionMode với hai tùy chọn: SourceOver (dựa trên thành phần alpha, pha trộn bất kỳ thứ gì được vẽ với nền đã tồn tại) hoặc SourceCopy chỉ đơn giản là ghi đè nền với bất kỳ thứ gì đang được vẽ.Thay đổi Chế độ Blend alpha trong WPF?

Có điều gì đó tương tự tồn tại trong WPF không?

Trong WPF khi tôi vẽ một PolyLine ví dụ trên đầu trang của một PolyLine mới luôn luôn alphablends với nền. Tôi nghĩ rằng đó là độc lập của container được sử dụng. Tôi đang sử dụng Canvas nhưng không thể tìm thấy thuộc tính chế độ hòa trộn ở bất kỳ đâu. Những gì tôi muốn làm là những gì các SourceCopy compositionmode đề cập ở trên không. I E. PolyLine mới chỉ cần ghi đè lên mọi thứ đã có trên Canvas. Có một cách đơn giản để làm điều đó, thiếu sử dụng các pixel shader (mà - theo như tôi hiểu - sẽ không hoạt động được vì tôi không có quyền truy cập vào Backbuffer Canvas).

Tôi không bị kẹt với Canvas và sẽ vui lòng sử dụng bất kỳ vùng chứa nào hỗ trợ chế độ ghi đè.

Tôi hiện đang có một giải pháp dựa trên WriteableBitmap mà tôi có được ngữ cảnh System.Drawing.Graphics và sau đó điều khiển ComponentMode. Nó hoạt động nhưng kể từ khi cửa sổ của tôi là toàn màn hình mà giải pháp có tác động hiệu suất nghiêm trọng.

Làm rõ và ví dụ: Cửa sổ WPF hoàn toàn trong suốt và do đó là Canvas (màu nền sau (0,0,0,0)). Bây giờ tôi vẽ một PolyLine với một Color.FromArgb (128,128,0,0). Bây giờ tôi có một polyline màu đỏ bán trong suốt. Tiếp theo tôi vẽ cùng PolyLine với Color.FromArgb (0,0,0,0). Kết quả cũng giống như trước vì việc trộn alpha diễn ra. Những gì tôi muốn, tuy nhiên, là polyline màu đỏ bị xóa với polyline thứ hai (đó là chính xác những gì các chế độ SourceCopy trong lớp đồ họa hiện.

Trả lời

0

Tôi nghĩ rằng tất cả các bạn cần làm là đảm bảo rằng các bàn chải được sử dụng để điền/đột quỵ các PolyLine có giá trị alpha hoàn toàn mờ đục (tức là 255).Sau đó, nền không nên được pha trộn vào nó

+1

Có, nhưng tôi cần ghi đè lên nền với bất kỳ giá trị alpha nào, thậm chí 0. Xem làm rõ và ví dụ tôi vừa thêm vào câu hỏi của mình. – Harald

0

Bạn có thể áp dụng một Clipping Mask, cách này bạn có thể cung cấp đường dẫn để clip trên các yếu tố bên dưới nó, nhưng nó có thể khó khăn để duy trì sau khi nhiều yếu tố được yêu cầu để được cắt bớt ...

+0

Trong giải pháp hiện tại của tôi bằng cách sử dụng WritableBitmap tôi áp dụng một clipping rect (thông qua AddDirtyRect). – Harald

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