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

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

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

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

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

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

Или не дошло) Можете небольшой пример показать для наглядности?
...
Рейтинг: 0 / 0
02.11.2015, 11:34
    #39092513
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
event добавления Child
Я вам слегка наврал, событие 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
02.11.2015, 12:07
    #39092554
AderAder
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
event добавления Child
Roman Mejtes, спасибо, я вот как раз пришел к этому решению недавно) Тоже прочитал что Loaded не Buble и опечалился, думал что что-то не так делаю
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / event добавления Child / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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