powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Затемнение области между главным окном и элементом
11 сообщений из 11, страница 1 из 1
Затемнение области между главным окном и элементом
    #39543959
pr-yanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Суть в том, что есть главное окно и я хочу затемнить и задизейблить всё, кроме одного из элементов.
Как это сделать?
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39543982
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pr-yanka,
поищи в этой ветке мою тему EventTrigger to DataTrigger - 95% готовый приме для твоего случая.
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39543994
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39543997
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
упс.
Если под "одиним" понимается не контрол, а модальное окно, то странно что такой вопрос вообще поднимается.
В WPF нет модального окна из коробки?
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39547616
pr-yanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделала таким макаром.

<Border Visibility="Collapsed" x:Name="ShadowOverlay">
<Border.Background>
<SolidColorBrush Color="Black" Opacity="0.6"/>
</Border.Background>
</Border>


После. бордера объявлена моя выезжающая панель.

В коде в нужным момент прописываю вот это:

ShadowOverlay.Visibility = Visibility.Visible;
MainGrid.IsEnabled = false;
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39547814
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это можно сделать через AdornerDecorator, по сути этот элемент будет находится выше ContentPresenter'а окна и полностью перекрывать все элементы управления. Цвет ему можно задать или прозрачность на выбор, можно наложить меш кисти и так далее. Могу кинуть пример :) если найду минут через 30
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39547858
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
44.
45.
46.
47.
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;

namespace WindowManagement
{
    /// <summary>
    /// Adorner для контрла, с помощью данного контрала можно разместить поверх любого контрола любой другой.
    /// </summary>
    public class AdornerContainer : Adorner
    {
        private UIElement _child;

        protected override int VisualChildrenCount => _child != null ? 1 : 0;

        public UIElement Child
        {
            get
            {
                return _child;
            }
            set
            {
                AddVisualChild(value);
                _child = value;
            }
        }

        public AdornerContainer(UIElement adornedElement)
            : base(adornedElement)
        {
        }

        protected override Visual GetVisualChild(int index)
        {
            if (index == 0 && _child != null)
                return _child;
            return base.GetVisualChild(index);
        }

        protected override Size ArrangeOverride(Size finalSize)
        {
            _child?.Arrange(new Rect(finalSize));
            return finalSize;
        }
    }
}



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
using System.Windows;
using WindowManagement;

namespace WpfApp5
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            BlurWindowHelper.Blur(this);
        }
    }
}



В данном примере показано, как добавляется Adorner к окну и добавляется в него Border который делает окно в полоску. Поверх бордера можно расположить любые другие контролы. Нужно только малость переделать. У меня за это отвечает WindowManager который отвечает за взаимодействие окон и открывание окон из модели представления.
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39547860
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл 2 класса
Код: 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.
using System.Windows;
using System.Windows.Documents;

namespace WindowManagement
{
    public static class AdornerHelper
    {

        public static void CreateElementAdornment(UIElement target, UIElement element)
        {
            //var contentPresenter = GetWindowContentPresenter(window);
            //if (contentPresenter == null) return null;
            var adornerLayer = AdornerLayer.GetAdornerLayer(target);
            var adornerContainer = new AdornerContainer(target) { Child = element };
            adornerLayer.Add(adornerContainer);
        }

        public static AdornerContainer GetElementAdornment(UIElement target)
        {
            //var contentPresenter = GetWindowContentPresenter(window);
            //if (contentPresenter == null) return null;
            var adornerLayer = AdornerLayer.GetAdornerLayer(target);
            var adorners = adornerLayer.GetAdorners(target);
            if (adorners == null || adorners.Length < 1) return null;
            return (AdornerContainer)adorners[0];
        }

        public static void RemoveAdorner(UIElement target)
        {
            var adornerLayer = AdornerLayer.GetAdornerLayer(target);
            var adornerContainer = GetElementAdornment(target);
            adornerLayer.Remove(adornerContainer);
        }
    }
}


Код: 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.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace WindowManagement
{
    public static class BlurWindowHelper
    {
        private static UIElement GetWindowContentPresenter(Window window)
        {
            //Находим корневой визуальный объект
            return VisualTree.FindChild<ContentPresenter>(window);
        }

        public static void Blur(Window window)
        {
            window.IsEnabled = false;
            var windowContentPresenter = GetWindowContentPresenter(window);
            //Viewport="0,0,4,4" ViewportUnits="Absolute"  TileMode="Tile" Stretch="Fill"
            var border = new Border
            {
                Background = new DrawingBrush
                {
                    Viewport = new Rect(0,0,4,4), ViewportUnits = BrushMappingMode.Absolute,  TileMode = TileMode.Tile, Stretch =  Stretch.Fill,
                    Drawing = new GeometryDrawing(Brushes.Transparent, new Pen(Brushes.Black, 1.0),  Geometry.Parse("M0,4 L4,0z"))
                },
                Opacity = 0.0
            };
            
            AdornerHelper.CreateElementAdornment(windowContentPresenter, border);

            var animation = new DoubleAnimation
            {
                To = 1.0,
                Duration = TimeSpan.FromSeconds(0.3)
            };
            border.BeginAnimation(UIElement.OpacityProperty, animation);
        }

        public static void Clear(Window window)
        {
            var windowContentPresenter = GetWindowContentPresenter(window);
            var container = AdornerHelper.GetElementAdornment(windowContentPresenter);
            var border = (Border)container.Child;
            var animation = new DoubleAnimation
            {
                To = 0.0,
                Duration = TimeSpan.FromSeconds(0.3)
            };
            //По завершению анимации удаляем Adorner и удаляем все 
            animation.Completed += (sender, e) =>
            {
                AdornerHelper.RemoveAdorner(windowContentPresenter);
            };
            border.BeginAnimation(UIElement.OpacityProperty, animation);
            window.IsEnabled = true;

        }
    }
}
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39547972
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesпо сути этот элемент будет находится выше ContentPresenter'а окна и полностью перекрывать все элементы управления.
Нет, ну я понимаю, в JS нет модальности и там надо делать подобное.
Но в винде на уровне операционки есть модальность и ничего не надо "затемнять сзади".
Или в WPF нет модальности?
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39547996
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Roman Mejtesпо сути этот элемент будет находится выше ContentPresenter'а окна и полностью перекрывать все элементы управления.
Нет, ну я понимаю, в JS нет модальности и там надо делать подобное.
Но в винде на уровне операционки есть модальность и ничего не надо "затемнять сзади".
Или в WPF нет модальности?
из проекта в котором это было, было модальное окно и окно которое в Layout поверх окна открывается.
иногда это может быть нужным. Но перед открытием модального окна , можно затемнить родительское, чтоб было визуально видно, что оно недоступно
...
Рейтинг: 0 / 0
Затемнение области между главным окном и элементом
    #39548060
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesPetro123пропущено...

Нет, ну я понимаю, в JS нет модальности и там надо делать подобное.
Но в винде на уровне операционки есть модальность и ничего не надо "затемнять сзади".
Или в WPF нет модальности?
из проекта в котором это было, было модальное окно и окно которое в Layout поверх окна открывается.
иногда это может быть нужным. Но перед открытием модального окна , можно затемнить родительское, чтоб было визуально видно, что оно недоступно
Т.е. я прав.
Модальное есть на самом деле, и под ним ничего не доступно.
А затемнение придумано как дизайн. Функционала то нету.
Вот это как раз я и не понимаю, и считаю не нужным.
Удачи!
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Затемнение области между главным окном и элементом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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