powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Effect, не затрагивающий детей
3 сообщений из 3, страница 1 из 1
WPF: Effect, не затрагивающий детей
    #39224816
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу, грубо говоря, размазать все вокруг объекта.

Например, применить BlurEffect на все содержимое Window кроме одной кнопки.
Проблема в том, что эффект применяется ко всей области родителя.
...
Рейтинг: 0 / 0
WPF: Effect, не затрагивающий детей
    #39224871
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант А)
тебе нужно отделить кнопку от родителя, то есть форма будет состоять из 2 частей:
1) контент который будет размываться
2) поверх А. будет накладываться еще 1 прозрачный (не Transparent) контейнер с кнопкой
вариант Б)
Создаем Adorner, который будет содержать панель Rectangle с VisualBrush и кнопкой.
Adorner будет накрывать собой форму, а размываться Rectangle.

других идей у меня нет. :)
...
Рейтинг: 0 / 0
WPF: Effect, не затрагивающий детей
    #39226233
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант А не очень подходит, не хочу предъявлять дополнительных требований к компоновке формы, хочу постараться инкапсулировать поведение во внутреннем элементе (условно - кнопке).

Вариант Б Roman Mejtesкоторый будет содержать панель Rectangle с VisualBrush и кнопкой.
Adorner будет накрывать собой форму, а размываться Rectangle."Простите, кто на ком стоял?" (с) Профессор Преображенский, "Собачье сердце".

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

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
  public class BlurAroundAdorner2 : Adorner
  {
    private const double radius = 10;
    private Thickness thickness;
    private Brush brush;

    /// <param name="adornerElement"> элемент, вокруг которого создается рамка</param>
    /// <param name="thickness"> толщина рамки </param>
    /// <param name="effectSourceVisual"> источник картинки для размытого фона рамки </param>
    public BlurAroundAdorner2(UIElement adornerElement, Thickness thickness, Visual effectSourceVisual)
      : base(adornerElement)
    {
      if (adornerElement == null || effectSourceVisual == null)
        throw new ArgumentNullException();

      this.thickness = thickness;
      brush = new VisualBrush(effectSourceVisual);
      Effect = new BlurEffect() { Radius = radius };
    }

    // рендер
    protected override void OnRender(DrawingContext drawingContext)
    {
      var outsideOuter = new RectangleGeometry(
        new Rect(-thickness.Left - radius,
                 -thickness.Top - radius,
                 ActualWidth + thickness.Left + thickness.Right + 2 * radius,
                 ActualHeight + thickness.Top + thickness.Bottom + 2 * radius));
      var insideOuter = new RectangleGeometry(
        new Rect(-thickness.Left,
                 -thickness.Top,
                 ActualWidth + thickness.Left + thickness.Right,
                 ActualHeight + thickness.Top + thickness.Bottom));
      var insideInner = new RectangleGeometry(new Rect(0, 0, ActualWidth, ActualHeight));
      var inside = new GeometryGroup() { Children = new GeometryCollection() { insideInner, insideOuter } };
      var outside = new GeometryGroup() { Children = new GeometryCollection() { outsideOuter, insideInner } };

      Clip = inside;
      drawingContext.DrawGeometry(new SolidColorBrush(Colors.White), null, outside);
      drawingContext.DrawGeometry(brush, null, insideOuter);
      
    }
  }



Белая подложка и Clip нужны из-за того, что если делать просто тупую рамку, размывание работает только по центру рамки, а у краев (по другую сторону которых как бы нет цвета) все остается контрастным, странно, но это так. При этом размывание вылезает за пределы рамки, то есть создает пятна на внутреннем элементе. В моем варианте с внешнего края идет размывание с белой подложкой, а по внутреннему краю - с продолжением визуальной копии исходного элемента, которая потом обрезается клипом.

Ты подобную компоновку имел ввиду или другую?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF: Effect, не затрагивающий детей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]