Как сделать тень в wpf

Обновлено: 08.07.2024

Новая платформа программирования Windows Presentation Foundation (WPF) позволяет создавать гораздо более привлекательные приложения по сравнению с разработкой окон на базе её старшей сестры Windows Forms. DirectX в основе обработки графики обеспечивает оживлённый интерфейс без замедления богатых графических эффектов. WPF имеет богатейший набор средств для украшения визуальных объектов приложений.

Анимация - вершина любых украшений, позволяет изготавливать приложения с визуальной реакцией на действия пользователя. Например, при наведении курсора на текст плавно увеличивается шрифт, при покидании размер шрифта восстанавливается. В WPF анимация является если не главной, то одной из самых важных частей. Созданию и управлению анимацией отведено отдельное пространство имён System.Windows.Media.Animation с множеством классов. На базе этих классов можно создавать анимацию любых видимых элементов.

Только базовых классов анимации насчитываются более 20, которые анимируют значения от простейших типов Boolean до сложных Matrix, Quaternion, Rotation3D, Vector3D. Мощная поддержка анимации позволяет создавать эффекты только путем создания объектов и настроек их свойств. Это избавляет программистов от трудоёмкой низкоуровневой работы.

Линейная интерполяция

Анимация – это последовательность визуальных событий, изменяющихся в какую-либо сторону с установленным шагом и продолжительностью. В данной статье речь будет идти об анимации, использующей линейную интерполяцию. Представители данного типа анимаций – классы DoubleAnimation , ColorAnimation , ThicknessAnimation , PointAnimation , RectAnimation и другие. Классы происходят от базового TimeLine, определяющий отрезок времени (временную шкалу, временную линию).

В WPF нет событий OnPaint() для перерисовки недействительной части окна. Более совершенная графическая модель отслеживает изменения визуальных элементов и мгновенно перерисовывает элемент, часть или полностью окно. Анимация в WPF – это плавное или дискретное изменение свойств зависимостей (свойств, изменения которых отслеживает система WPF). Все классы линейной интерполяции имеют интуитивно понятный набор параметров: начальное значение From, конечное To и продолжительность Duration. Для более сложных анимаций предусмотрены и другие свойства: By, EasingFunction, IsAdditive, IsCumulative.

От теории к практике

Исходник, подготовленный для этой статьи, демонстрирует общие принципы создания и настройки анимационных свойств. Для создания анимаций используются методы элементов UIElement.BeginAnimation , классы DoubleAnimation , ColorAnimation , PointAnimation , ThicknessAnimation . Анимация применяется к свойствам прозрачности, цвета, градиентной окраски и толщины бордюра элементов. Все действующие модели анимаций компактно оформлены в одном приложении с помощью элемента TabControl.

  • CommonMembers
  • OpacityAnimation
  • GradientAnimation
  • ColorBrushAnimation
  • BorderAnimation

Opacity Animation – анимация прозрачности

WPF, Анимация прозрачности

Самый простой способ анимировать свойства объекта — это использование метода элемента BeginAnimation(OpacityProperty op, DoubleAnimation da) . Создаётся шкала времени ( DoubleAnimation ) и указывается на какое свойство зависимости она будет воздействовать ( OpacityProperty ). Вызов этого метода немедленно запускает анимацию. Данный способ применения анимации экономичен при создании разовой, недлительной анимации, например изменение цвета элемента при наведении и покидании курсора, увеличение шрифта при выделении пункта и т.п. Остановить такую анимацию можно повторным вызовом метода с значением временной шкалы null: BeginAnimation(op, null) .

Класс OpacityAnimation использует анимационные возможности кнопки методом, доставшегося ей от базового UIElement . Получившаяся анимация похожа на игру. На поле находится кнопка, при нажатии на неё она плавно увеличивает свою прозрачность, до полного исчезновения. В прозрачном, невидимом состоянии кнопка скачкообразно перемещается в случайное место на поле и далее восстанавливает свою видимость. При следующем нажатии цикл повторяется.

Роль игрового поля играет панель Canvas. Данный вид контейнера позволяет размещать дочерние элементы используя абсолютную систему координат. По завершении анимации прозрачности кнопки генерируется событие Complected, в котором далее вызываются методы перемещения и отложенной анимации "всплытия" кнопки.

Листинг класса OpacityAnimation:

ColorBrush Animation – анимация цвета

WPF, Анимация цвета

Следующий класс приложения ColorBrushAnimation . Класс выполняет анимацию цвета 4-х прямоугольников. Назначенные цвета интерполируя переходят от одной фигуры к другой. Запускается анимация щелчком мыши по вкладке TabControl.

Управление цветом осуществляет объект класса ColorAnimation , специально созданным для анимации цвета. Свойства класса From и To имеют тип System.Windows.Media.Color. Каждому прямоугольнику для закрашивания назначается сплошная цветная кисть SolidColorBrush. Для управления свойством ColorProperty, каждой кисти назначается имя. Класс SolidColorBrush не имеет в своём составе свойства Name, поэтому уникальное имя регистрируется вспомогательным методом RegisterName(имя, кисть) в пределах области окна приложения.

Для каждого прямоугольника используется анимация из 4-х цветов. Управление 16-ю временными линиями ColorAnimation доверено раскадровке Storyboard. С целью унификации независимую анимацию для каждого прямоугольника создаёт единственный метод. Если не предпринять меры, то при щелчках мыши в раскадровку будут добавляться каждый раз по 16 элементов. Для мониторинга заполнения раскадровки, объектам ColorAnimation присваиваются уникальные имена. Перед вставкой проверяется наличие в раскадровке элементов с идентичными параметрами, если выявлен повтор, вставка не происходит.

Листинг класса анимации цвета:

Gradient Animation – анимация градиента

WPF, Анимация градиента

Класс GradientAnimation управляет градиентной анимацией двух прямоугольников. Два цвета, две точки градиентного раздела. Синхронно, циклично границы между цветами одного и другого прямоугольника плавно скользят в горизонтальной плоскости. В классе GradientAnimation демонстрируется анимация для типа System.Windows.Point. Используемая временная линия так и называется PointAnimation. В качестве объектов анимации участвуют градиентные кисти LinearGradientBrush. Изменение значений свойств зависимостей startPoint и endPoint создаёт эффектную анимацию градиентов на поверхностях прямоугольников.

Метод элементов BeginAnimation(…) обеспечивает полноценную анимацию, но малоуправляемую. Кроме того, она применима только для набора свойств зависимостей одного элемента. В классе GradientAnimation , в отличие от других классов анимации приложения, используется управляемая анимация одновременно двух элементов. Её можно приостановить, продолжить, остановить и начать заново. Эффективно управлять анимацией, изменять её режимы работы, обеспечивать синхронное изменение свойств группы элементов под силу только контейнеру для временных шкал Storyboard.

Листинг класса GradientAnimation:

Border Animation – анимация границы элемента

Ещё одна анимация приложения использует временную шкалу для изменения толщины декоративного элемента Border. Толщина рамки элемента задаётся структурой Thickness. В WPF и для этого случая есть класс анимации ThicknessAnimation (временная шкала). Задавая различные сочетания значений From и To можно анимировать границы по отдельности или плавно изменять толщину у всех одновременно.

Запускается анимация щелчком по прямоугольнику, вокруг которого обернут бордюр. Толщина рамки плавно увеличивается по часовой стрелке и затем, в этом же направлении, уменьшается до первоначального размера. По завершению анимационного круга вызывается событие Completed и раскадровка очищается от исполненных временных шкал.

Теперь я хотел бы добавить тень, похожую на программное обеспечение zune pc. Я читал об этом, и включенный эффект drophadoweffect не покрывает все углы моего окна и, как говорят, убивает производительность.

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

Как лучше всего добавить тень, которую можно применить к сетке, которая не убивает производительность и не отбрасывает тень во всех направлениях?

введите описание изображения здесь

Я пытаюсь изменить размер эффекта тени в WPF. Но я не нашел ответа.

Почему? Второе изображение - это физически правильная тень. На первой странице тень должна идти гораздо дальше вниз и вправо, это контролируется свойством ShadowDepth .

Я думаю, вам стоит предоставить больше информации. Фигура справа - обычная падающая тень. То, что слева - нет. Простое размещение смещенного черного прямоугольника позади синего прямоугольника кажется очевидным ответом, но может не удовлетворить требованиям.

Вы не можете установить маржу для своей тени, поэтому вы можете "скрыть" еще один простой

Оберните их сеткой, которая будет удерживать их в одном месте.

Установите маржу на этой границе, а также установите на ней эффект тени.

Попробуйте дать DropShadowEffect другие параметры, увеличить тень, может быть, что-то ее скрывает / режет / мешает?

Спасибо брат. Вы решили мою проблему. Но у меня есть последний вопрос, что в этом меню есть две разные границы, поэтому что выполняется первым? Я просто копирую границу и вставляю в тот же самый , он работает, потому что я должен идеально настроить Content presenter. Но я так и не понял, как работает этот механизм накрутки? Вы можете объяснить.

Добрый день, как сделать полноценную тень (такую же как у окон windows), для формы со свойством FormBorderStyle=none?

Разместите за этой формой - другую, полупрозрачную, и чуть ниже-левее (выше-правее :-) ) чем основная. и серенького цвета.

Спасибо за ответ, просто предложенный вами способ получается без градиента. Т.е. тень получается "топорной" (просто мне тень нужна, Glow - ну чтоб, со всех сторон).

Разместите за этой формой - другую, полупрозрачную, и чуть ниже-левее (выше-правее :-) ) чем основная. и серенького цвета.


Спасибо за ответ, просто предложенный вами способ получается без градиента. Т.е. тень получается "топорной" (просто мне тень нужна, Glow - ну чтоб, со всех сторон).

в, общем вот, что получается:

1. Вариант "Прозрачный фон, на нем png-картинка с тенью":


вывод:
форма - прозрачна, но там где должна быть тень, закрашивается непонятным цветом. т.е. она не прозрачна :(

2. Вариант "Прозрачная форма позади основной":


вывод:
тень получается "топорной", сморится ужасно. Одним словом - неВариант!

Нужно решение, похожее на стандартное решение windows:


такая красивая тенюшка. с плавным переходом в прозрачность -_-

Это же виндовс 7.
Переходите на WPF.
На винформах подобные фокусы не предусмотрены.
Плавного перехода в прозрачность в них нет.
Как вариант - сделайте стопку форм, каждую заднюю чуь больше, и с убывающей прозрачностью. :-)

Но это работать хорошо уже не будет.

Это же виндовс 7.
Переходите на WPF.
На винформах подобные фокусы не предусмотрены.
Плавного перехода в прозрачность в них нет.
Как вариант - сделайте стопку форм, каждую заднюю чуь больше, и с убывающей прозрачностью. :-)

Но это работать хорошо уже не будет.


Можно, конечно.
Однако, я вот что хочу сказать. Пользователю привычно работать со стандартным окружением. Если не предусмотрено для данного типа окон тени - так и нужно оставлять. Не путать пользователя.
Другое замечание. Сейчас уже происходит переход к Win8, происходит отказ от закруглений, от градиентов, полутонов. MetroGUI отаке! А многие разрабы продолжают жить в прошлом, и создают пёстрые формочки с круглыми кнопочками.

Типа как раньше - столяр от нефиг делать делал стул с резными ножками, всякими там завитушками, строитель ангелочков на фасад здания лепил.
А сейчас - пластиковая штамповка и застекленный прямоугольный параллилепипед.


Можно, конечно.
Однако, я вот что хочу сказать. Пользователю привычно работать со стандартным окружением. Если не предусмотрено для данного типа окон тени - так и нужно оставлять. Не путать пользователя.
Другое замечание. Сейчас уже происходит переход к Win8, происходит отказ от закруглений, от градиентов, полутонов. MetroGUI отаке! А многие разрабы продолжают жить в прошлом, и создают пёстрые формочки с круглыми кнопочками.

вопрос исчерпан, вот результат:


решение, как и предполагал в предыдущем ответе, заключается в следующем:

нашел статью, про создание формы, по png-картинке (ссылка на исходник, с примером такой формы у меня в dopboxe dropbox link), статья на хабре тоже помогла.
+
движение сделал по такому принципу daniweb

не забываем убивать форму с тенью и отрисовывать ее заново, при переходе на другую.

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

Я хочу сделать тень на этом прямоугольнике, который я рисую программно в WPF. Как мне это сделать?

Добавить эффект в Visual

Попробуйте что-то вроде этого

enter image description here

РЕДАКТИРОВАТЬ

Если у вас нет элемента пользовательского интерфейса для присоединения эффекта, вам нужно сделать тень самостоятельно. Просто добавьте еще один прямоугольник под своей основной, с некоторой градиентной кистью, которая станет прозрачной.

Читайте также: