WPF Создание кастомного стиля окна с тенью

352
05 июня 2017, 21:22

Задачей является создание кастомного стиля окна обладающего следующими свойствами:

  • Тень в четыре направления (left, top, right, bottom)
  • Наличие хрома или, иначе, области за которую можно окно перетаскивать
  • Возможность изменения размера окна мышью
  • Тень приравнивается к областям, которые не имеют цвета на прозрачных окнах: это означает, что мы можем не только наблюдать за элементами других окон, которые находятся за тенью, но и работать с ними прямо сквозь тень (точно таким же свойством обладают окна с установленным в True свойством AllowsTransporency и не имеющего никакого цвета фона).
  • Анимации сворачивания и разворачивания окон в Windows

Проблематика:

  1. Хром окна всегда расположен сверху. Мы можем лишь задать его высоту (WindowChrome.CaptureHeight). Отсюда вытекает невозможность создания верхней тени, ведь она будет лишь фоном хрома и за неё можно будет потянуть окно. Решением может быть либо отрисовка тени на более низком уровне (WinApi; понятия не имею как), либо отказ от WindowChrome и использование Border, у которого есть обработчик MouseLeftButtonDown с вызовом в нём Window.DragMove метода.

  2. Пункт 4 их списка выше. Вот тут и идей я даже не имею. Разве что, опять же, рисовка тени окна на более низком чем WPF уровне...

  3. Анимацию сворачивания и разворачивания окна при WindowStyle в None не работают. Но можно сделать следующим образом: при сворачивании поменять стиль окна с None на любой другом, и, соответственно, при разворачивании делать наоборот. Но уж как-то совершенно в лоб.
  4. WindowChrome.ResizeBorderThickness позволяет задать толщину бордюра для ресайза окна. Но он и понятия никакого не имеет об отступах - там где у нас тень, там и будет расположен.
READ ALSO
Выполнение SqlBulkCopy и Entity Framework в одной транзакции

Выполнение SqlBulkCopy и Entity Framework в одной транзакции

Открываю транзакцию в EF вызовом:

204
C# Entity Framework

C# Entity Framework

Здравствуйтe, помогите разобраться пожалуйста Надо по первым 3 символам или больше в textBox найти записи в базе данных и отобразить их в ListboxЕсть...

275
Как заменить текст в docx

Как заменить текст в docx

Есть документ с содержимым вроде "Привет [[username]]"Нужно программно заменить "[[username]]" на свой текст не испортив форматирование и не используя...

262
SqlBulkCopy вылетает по TimeOut

SqlBulkCopy вылетает по TimeOut

Сначала пытался закинуть в SqlBulkCopy DataTable из 1000 (Для теста), но получил ошибку таймаута

265