2011-02-06 4 views
6

Класс System.Drawing.Graphics имеет свойство CompositionMode с двумя параметрами: SourceOver (который на основе альфа-компонента смешивает все, что нарисовано с уже существующим фоном) или SourceCopy, который просто перезаписывает фон тем, что рисуется.Изменить режим смешивания альфа в WPF?

Что-то подобное существует в WPF?

В WPF, когда я рисую PolyLine, например, поверх другого, новая PolyLine всегда имеет алфавит с фоном. Я думаю, что это не зависит от используемого контейнера. Я использую Canvas, но не могу найти свойство blend mode в любом месте. То, что я хочу сделать, - это то, что упоминает вышеописанный метод SourceCopy. То есть новая PolyLine должна просто перезаписать все, что уже есть на Canvas.

Есть ли простой способ сделать это, за исключением использования пиксельных шейдеров (которые, насколько я понимаю, не будут работать, потому что у меня нет доступа к буферному бланку Canvas).

Я не застрял на холсте и буду рад использовать любой контейнер, который поддерживает режим перезаписи.

В настоящее время у меня есть решение на основе WriteableBitmap, для которого я получаю контекст System.Drawing.Graphics, а затем манипулирую CompositionMode. Он работает, но поскольку мое окно полноэкранное, это решение имеет серьезные последствия для производительности.

Уточнение и пример: Окно WPF полностью прозрачно, а также Canvas (задний цвет земли (0,0,0,0)). Теперь я рисую PolyLine с Color.FromArgb (128,128,0,0). Теперь у меня полупрозрачная красная полилиния. Затем я рисую одну и ту же PolyLine с Color.FromArgb (0,0,0,0). Результат такой же, как и раньше, из-за происходящего альфа-смешивания. Тем не менее, я хочу, чтобы красная полилиния была стерта с помощью второй полилинии (это именно то, что делает режим SourceCopy в классе Graphics.

ответ

0

Я думаю, что все, что вам нужно сделать, это убедиться, что кисти, используемые для fill/stroke PolyLine имеют полностью непрозрачные значения альфа (то есть 255). Затем фон не должен смешиваться с ним.

+1

Да, но мне нужно переписать фон ЛЮБОЙ альфа-значением, даже 0. См. пояснения и пример, который я только что добавил к моему вопросу. – Harald

0

Вы можете применить обтравочную маску, таким образом, вы можете предоставить путь для клипа по элементам, которые ниже, но это может быть трудно поддерживать после того, как требуется множество элементов для обрезки ...

+0

В моем текущем решении с использованием WritableBitmap я применяю обрезающий прямоугольник (через AddDirtyRect). – Harald

Смежные вопросы