Возможно ли изменить цвет нарисованной с помощью DrawingVisual фигуры?
Здравствуйте! Возможно ли изменить цвет нарисованного с помощью вызова метода DrawRectangle объекта DrawingContext прямоугольника? Таких прямоугольников будет больше одного, следовательно необходимо как-то найти область занятую прямоугольником, очистить её, а потом залить новым цветом. Или можно залить новый цвет прямо поверх предыдущего? Или же рисование с помощью DrawingVisual вообще не предусматривает дальнейшего изменения?
Заранее спасибо за ответ.
Вы бы почитали как вообще в ПК работают изображения и каким образом оно показывается на экране. Если говорить простыми словами: есть контекст рисования (изображение/виртуальный экран), который состоит из двухмерного массива пикселей. Когда какая-то функция рисует какую-то фигуру в этом экране — то она просто меняет цвет пикселей там. Если надо нарисовать фигуру другого цвета — то просто берем и вызываем эту функцию с теми же параметрами, но другим цветом.
Т.е. достаточно всего лишь перерисовать на том же самом месте ту же самую фигуру, но уже с другим цветом? А не получится ли так, что старый цвет останется, и новый будет нарисован поверх него? Соответственно, если я буду менять цвет не единожды, то цвета будут накладываться друг на друга, и в конце концов это станет заметно. Или я не прав, и такого не произойдет?
Что если я захочу кроме цвета изменить, допустим, сам прямоугольник, например, скруглить его углы. Для этого я нарисую новую фигуру - прямоугольник со скруглёнными углами, но старый прямоугольник останется и его нескруглённые углы будут видны. Как быть в таком случае? Может быть все-таки есть способ, как обратится к отдельному объекту в DrawingVisual после того как рисование завершилось и изменить его свойства?
Leo_Eldorado, я честно хз как это делается в WPF, но я бы делал по классике. Храните все нужные сейчас фигуры с нужными вам свойствами. По изменению любой фигуры - полностью очищаете канву и заново все рисуете. +буфферизация.
Т.е. достаточно всего лишь перерисовать на том же самом месте ту же самую фигуру, но уже с другим цветом?
Да.
Что если я захочу кроме цвета изменить, допустим, сам прямоугольник, например, скруглить его углы. Для этого я нарисую новую фигуру - прямоугольник со скруглёнными углами, но старый прямоугольник останется и его нескруглённые углы будут видны.
Да, будут видны.
Соответственно, если я буду менять цвет не единожды, то цвета будут накладываться друг на друга, и в конце концов это станет заметно.
Неверно. При рисовании цвета не накладываются, а заменяются и старый цвет не запоминается, т.к. каждый пиксель — это ячейка в памяти и каждый раз при записи нового значения (цвет) старое перезаписывается.
Что если я захочу кроме цвета изменить, допустим, сам прямоугольник, например, скруглить его углы. Для этого я нарисую новую фигуру - прямоугольник со скруглёнными углами, но старый прямоугольник останется и его нескруглённые углы будут видны. Как быть в таком случае?
Стереть старый прямоугольник: если фон — однородный цвет, то просто еще раз его нарисовать в данном цвете, если фон не однородный — то сначала отрисовать фон там, где он был изменен, а уже потом рисовать новую фигуру.
Может быть все-таки есть способ, как обратится к отдельному объекту в DrawingVisual после того как рисование завершилось и изменить его свойства?
Самый просто вариант — сделать список объектов, которые отрисовываются в вашем случае. И при необходимости перерисовки их перерисовывать.
VoidVolker, спасибо за обстоятельный ответ. На самом деле, как выяснилось, способ обратиться к отдельному объекту нарисованному с помощью DrawingVisual есть - в этом объекте есть свойство Drawing, которое в свою очередь содержит свойство Children типа DrawingCollection. Именно эта коллекция и хранит все то, чтобы было нарисовано в контексте DrawingContext. Да и становится она доступной только после закрытия оного. Эта коллекция содержит объекты типа GeometryDrawing. Объекты этого типа содержат разные методы и свойства, среди которых присутствует свойство Brush. Пробовал менять его, устанавливая другой цвет, но никакого эффекта это не дало. Если для того, чтобы изменить цвет нарисованного элемента, достаточно закрасить его новым цветом, никак не очищая перед этим поверхность, то буду делать так. Спасибо за ответ.
VoidVolker, попробовал нарисовать линию сначала чёрным цветом, а потом красным на одном и том же месте и получил вот что:
Видно, что если один цвет отображён поверх другого, то происходит наслоение цветов, таким образом вот это утверждение
Неверно. При рисовании цвета не накладываются, а заменяются и старый цвет не запоминается, т.к. каждый пиксель — это ячейка в памяти и каждый раз при записи нового значения (цвет) старое перезаписывается.
для DrawingVisual неверно и нужно искать какой-то другой способ как изменить цвет нарисованного ранее элемента. Более того, если нарисовать на одном и том же месте линию одного цвета, скажем 1000 раз, то линия станет ощутимо жирнее.
В данном случае включено сглаживание. И я говорил в целом, а не про конкретно DrawingVisual. Как там оно все внутри я доку не читал и возможно, оно там хранит список рендеринга/сцену. https://stackoverflow.com/questions/16935376/wpf-d... - вот тут похожий вопрос.