powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / event добавления Child
9 сообщений из 9, страница 1 из 1
event добавления Child
    #39091254
AderAder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток. Может кто поделиться ответом на вопрос - как реализовать функционал нотификации при добавлении дочерних элементов? Допустим есть Grid, в нем переопределен метод OnVisualChildrenChanged, а как узнать что к потомку Grid добавился еще один потомок?
...
Рейтинг: 0 / 0
event добавления Child
    #39091399
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AderAder,

думаю самый правильный способ будет использовать RoutedEvent типа Bubble.
Из уже существующих, можно слушать Loaded, оно сработает когда будет элемент будет создан или какие то другие или даже своё.
...
Рейтинг: 0 / 0
event добавления Child
    #39092343
AderAder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Метод Loaded я же могу слушать только у непосредственного потомка. Допустим есть два кастомных UserControl, если я непосредственно при инициализации загружу в первый, допустим грид, то я смогу подписаться на его Loaded, а вот как быть если я уже в процессе выполнения именно в Грид добавлю второй UserControl, то собственно нужно как то научить Грид выдавать сообщения о изменении колекции чаилдов, а вот с этим проблема(
...
Рейтинг: 0 / 0
event добавления Child
    #39092345
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AderAderRoman Mejtes,

Метод Loaded я же могу слушать только у непосредственного потомка. Допустим есть два кастомных UserControl, если я непосредственно при инициализации загружу в первый, допустим грид, то я смогу подписаться на его Loaded, а вот как быть если я уже в процессе выполнения именно в Грид добавлю второй UserControl, то собственно нужно как то научить Грид выдавать сообщения о изменении колекции чаилдов, а вот с этим проблема(Вы хотя бы перед тем как ответить почитайте про то. что такое маршрутизируемые события в WPF.
Как только в Grid будет добавлен UserControl в Grid'е "всплывет" событие Control.Loaded, которое вы сможете с лёгкостью обработать, если подписаны на обработку этого маршрутизирумого события. Источник события можно получить получить из e.Source или e.OriginalSource, в зависимости от уровня детализации ваших UserControl'ов.
Что обрабатывать Routed Events не нужно непосредственно подписываться на событие какого то экземпляра класса, достаточно выбрать правильный "уровень" визуального дерева, где вы ожидаете всплытие этого события.
...
Рейтинг: 0 / 0
event добавления Child
    #39092354
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesAderAder,

думаю самый правильный способ будет использовать RoutedEvent типа Bubble.Или AttachepProperty + FrameworkPropertyMetadataOptions.Inherits .
...
Рейтинг: 0 / 0
event добавления Child
    #39092364
AderAder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Спасибо, до меня дошло)
...
Рейтинг: 0 / 0
event добавления Child
    #39092390
AderAder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes,

Или не дошло) Можете небольшой пример показать для наглядности?
...
Рейтинг: 0 / 0
event добавления Child
    #39092513
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вам слегка наврал, событие Loaded не Bubble, а Direct, по этому оно не всплывает. По этому, можно создать своё событие Bubble, и запилить как вам будет угодно. Вот пример:
Окно:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<Window x:Class="WpfApplication42.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style TargetType="{x:Type StackPanel}">
            <Setter Property="Margin" Value="3"/>
        </Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Margin" Value="3"/>
            <Setter Property="Padding" Value="10,3"/>
        </Style>
    </Window.Resources>
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
            <Button Content="Add UserControl1"
                    Click="AddUserControl1_OnClick"/>
            <Button Content="Add UserControl2"
                    Click="AddUserControl2_OnClick"/>
        </StackPanel>
        <StackPanel x:Name="MyPanel" Orientation="Vertical"/>
    </DockPanel>
</Window>



Код: 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.
using System.Diagnostics;
using System.Windows;

namespace WpfApplication42
{
    public partial class MainWindow : Window
    {

        public static readonly RoutedEvent UserControlLoadedEvent = EventManager.RegisterRoutedEvent("UserControlLoaded", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MainWindow));

        public MainWindow()
        {
            InitializeComponent();
            AddHandler(UserControlLoadedEvent, new RoutedEventHandler(OnUserControlLoaded), true);
        }

        private void OnUserControlLoaded(object sender, RoutedEventArgs e)
        {
            Debug.Print(e.OriginalSource.ToString());
        }


        private void AddUserControl1_OnClick(object sender, RoutedEventArgs e)
        {
            MyPanel.Children.Add(new UserControl1());
        }

        private void AddUserControl2_OnClick(object sender, RoutedEventArgs e)
        {
            MyPanel.Children.Add(new UserControl2());
        }
    }
}


UserControl'ы:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<UserControl x:Class="WpfApplication42.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
        <Border Background="BlanchedAlmond" MinHeight="50"/>
</UserControl>


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

namespace WpfApplication42
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
            Loaded += UserControl1_Loaded;
        }

        void UserControl1_Loaded(object sender, RoutedEventArgs e)
        {
            RaiseEvent(new RoutedEventArgs(MainWindow.UserControlLoadedEvent, this));
        }
    }
}


Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
<UserControl x:Class="WpfApplication42.UserControl2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
        <Border Background="LightBlue" MinHeight="50"/>
</UserControl>


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

namespace WpfApplication42
{
    public partial class UserControl2 : UserControl
    {
        public UserControl2()
        {
            InitializeComponent();
            Loaded += UserControl2_Loaded;
        }

        void UserControl2_Loaded(object sender, RoutedEventArgs e)
        {
            RaiseEvent(new RoutedEventArgs(MainWindow.UserControlLoadedEvent, this));
        }
    }
}


...
Рейтинг: 0 / 0
event добавления Child
    #39092554
AderAder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, спасибо, я вот как раз пришел к этому решению недавно) Тоже прочитал что Loaded не Buble и опечалился, думал что что-то не так делаю
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / event добавления Child
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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