Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/58: Рейтинг темы: голосов - 58, средняя оценка - 4.71
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

Как узнать, что на событие подписан метод обработчик?

09.03.2014, 03:01. Показов 12016. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Смотрите закомментированный код, вот он не работает, но это я как раз и хочу сделать.

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
        private Duration _duration;
        public void BeginForeverAnimationWithPause(Duration duration, bool pause = false)
        {
            //var handler = _animation.Completed;
            //if (handler != null)
            //    _animation.Completed -= ForeverAnimationWithPause_Completed;
            if (pause)
            {
                _animation = new Int32Animation(FrameIndex, FrameIndex, duration);
                _animation.RepeatBehavior = new RepeatBehavior(0d);
            }
            else
            {
                double onePercent = 100d / _pictures.Length - 1d;
                double onePercentTicks = duration.TimeSpan.Ticks / 100d;
 
                Duration dur = new Duration(new TimeSpan((long)(duration.TimeSpan.Ticks - onePercentTicks * onePercent * FrameIndex)));
                _duration = duration;
                _animation = new Int32Animation(FrameIndex, _pictures.Length - 1, FrameIndex == 0 ? duration : dur);
                _animation.Completed += ForeverAnimationWithPause_Completed;
            }
 
            BeginAnimation(FrameIndexProperty, _animation);
        }
 
        private void ForeverAnimationWithPause_Completed(object sender, EventArgs e)
        {
            _animation.Completed -= ForeverAnimationWithPause_Completed;
            _animation = new Int32Animation(0, _pictures.Length - 1, _duration);
            _animation.RepeatBehavior = RepeatBehavior.Forever;
            BeginAnimation(FrameIndexProperty, _animation);
        }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.03.2014, 03:01
Ответы с готовыми решениями:

Как создать событие и обработчик к нему
Здравствуйте! Как создать событие и обработчик к нему, которое будет реагировать на изменение определенного поля класса?

Как повесить обработчик на событие выхода из MS Access?
Как повесить обработчик на событие выхода из MS Access?

Как узнать пришли ли данные в обработчик?
при авторизации с помощью яваскрипт не происходит вход скрипт подтверждает что данные верны,но нет то ли ответа от обработчика,то ли...

19
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
09.03.2014, 09:22
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
using System;
using System.Reflection;
 
namespace Ghost
{
    class Test
    {
        public event EventHandler<string> Event;
    }
 
    class Program
    {
        static void Handler1(object sender, string param)
        {
 
        }
 
        static void Handler2(object sender, string param2)
        {
 
        }
 
        static void Main(string[] args)
        {
            Test test = new Test();
            test.Event += Handler2;
            FieldInfo e = typeof(Test).GetField("Event", BindingFlags.Instance | BindingFlags.NonPublic);
            EventHandler<string> handler = (EventHandler<string>)e.GetValue(test);
            Delegate[] delegates = handler.GetInvocationList();
            bool handler1Exists = false;
            bool handler2Exists = false;
            foreach (Delegate d in delegates)
            {
                EventHandler<string> h1 = new EventHandler<string>(Handler1);
                EventHandler<string> h2 = new EventHandler<string>(Handler2);
                handler1Exists = d.Equals(h1) || handler1Exists;
                handler2Exists = d.Equals(h2) || handler2Exists;
            }
            Console.WriteLine("Handler 1 {0}", handler1Exists ? "найден" : "не найден");
            Console.WriteLine("Handler 2 {0}", handler2Exists ? "найден" : "не найден");
        }
    }
}
Или так
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
using System;
using System.Reflection;
 
namespace Ghost
{
    class Test
    {
        public event EventHandler<string> Event;
    }
 
    class Program
    {
        static void Handler1(object sender, string param)
        {
 
        }
 
        static void Handler2(object sender, string param2)
        {
 
        }
 
        static void Main(string[] args)
        {
            Test test = new Test();
            test.Event += Handler2;
            FieldInfo e = typeof(Test).GetField("Event", BindingFlags.Instance | BindingFlags.NonPublic);
            EventHandler<string> handler = (EventHandler<string>)e.GetValue(test);
            Delegate[] delegates = handler.GetInvocationList();
            bool handler1Exists = false;
            bool handler2Exists = false;
           
            foreach (Delegate d in delegates)
            {
                handler1Exists = d.Method == typeof(Program)
                    .GetMethod("Handler1", 
                        BindingFlags.NonPublic | BindingFlags.Static) 
                    || handler1Exists;
                handler2Exists = d.Method == typeof(Program)
                    .GetMethod("Handler2", 
                        BindingFlags.NonPublic | BindingFlags.Static) 
                    || handler2Exists;
            }
            Console.WriteLine("Handler 1 {0}", handler1Exists ? "найден" : "не найден");
            Console.WriteLine("Handler 2 {0}", handler2Exists ? "найден" : "не найден");
        }
    }
}
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 12:40  [ТС]
Оба примера не компилируются. Я, конечно, знаю как решить проблему. Но просто сказал.

Добавлено через 1 минуту
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
63
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
 
namespace ConsoleApplication1
{
    class StringEventArgs : EventArgs
    {
        public StringEventArgs(string text)
        {
            Text = text;
        }
 
        public string Text { get; set; }
    }
 
    class Test
    {
        public event EventHandler<StringEventArgs> Event;
    }
 
    class Program
    {
        static void Handler1(object sender, StringEventArgs param)
        {
 
        }
 
        static void Handler2(object sender, StringEventArgs param)
        {
 
        }
 
        static void Main(string[] args)
        {
            Test test = new Test();
            test.Event += Handler2;
            FieldInfo e = typeof(Test).GetField("Event", BindingFlags.Instance | BindingFlags.NonPublic);
            var handler = (EventHandler<StringEventArgs>)e.GetValue(test);
            Delegate[] delegates = handler.GetInvocationList();
            bool handler1Exists = false;
            bool handler2Exists = false;
 
            foreach (Delegate d in delegates)
            {
                handler1Exists = d.Method == typeof(Program)
                    .GetMethod("Handler1",
                        BindingFlags.NonPublic | BindingFlags.Static)
                    || handler1Exists;
                handler2Exists = d.Method == typeof(Program)
                    .GetMethod("Handler2",
                        BindingFlags.NonPublic | BindingFlags.Static)
                    || handler2Exists;
            }
            Console.WriteLine("Handler 1 {0}", handler1Exists ? "найден" : "не найден");
            Console.WriteLine("Handler 2 {0}", handler2Exists ? "найден" : "не найден");
 
            Console.ReadKey();
        }
    }
}
Добавлено через 12 минут
Петррр, странно, но почему-то вот такой код возвращает null
C#
1
FieldInfo fInfo = typeof(Clock).GetField("Completed", BindingFlags.Instance | BindingFlags.NonPublic);
System.Windows.Media.Animation.Clock
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2014, 13:09
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
using System;
using System.Linq;
 
namespace ConsoleApplication20
{
    class Program
    {
        private static event EventHandler MyEvent;
        static void Main()
        {
            EventHandler ev1 = (sender, eventArgs) => Console.WriteLine("Hello");
            EventHandler ev2 = (sender, eventArgs) => Console.WriteLine("World");
            EventHandler ev3 = (sender, eventArgs) => Console.WriteLine("I'm not in the list");
            MyEvent += ev1;
            MyEvent += ev2;
 
            Console.WriteLine("Method '{0}' is subscribed = {1}", ev2.Method.Name, IsSubscribed(MyEvent, ev2));
            Console.WriteLine("Method '{0}' is subscribed = {1}", ev3.Method.Name, IsSubscribed(MyEvent, ev3));
        }
 
        private static bool IsSubscribed(EventHandler @event, EventHandler eventHandler)
        {
            return @event.GetInvocationList().Contains(eventHandler);
        }
    }
}
Добавлено через 4 минуты
Или даже так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    class Program
    {
        private static event EventHandler MyEvent;
        static void Main()
        {
            EventHandler ev1 = (sender, eventArgs) => Console.WriteLine("Hello");
            EventHandler ev2 = (sender, eventArgs) => Console.WriteLine("World");
            EventHandler ev3 = (sender, eventArgs) => Console.WriteLine("I'm not in the list");
            MyEvent += ev1;
            MyEvent += ev2;
 
            Console.WriteLine("Method '{0}' is subscribed = {1}", ev2.Method.Name, MyEvent.IsSubscribed(ev2));
            Console.WriteLine("Method '{0}' is subscribed = {1}", ev3.Method.Name, MyEvent.IsSubscribed(ev3));
        }
    }
 
    public static class EventExtender
    {
        public static bool IsSubscribed(this EventHandler @event, EventHandler eventHandler)
        {
            return @event.GetInvocationList().Contains(eventHandler);
        }
    }
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 13:10  [ТС]
Psilon, сейчас проверю.

Почему вы не ставите в конце Console.ReadKey(); У вас программа не завершает сразу работу?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2014, 13:12
Casper-SC, ctrl+f5. Он и компилируется быстрее (особенно заметно на WPF). Вернее компилируется столько же, но не пытается аттачиться к процессу.

А экстеншн лучше тогда еще и для генериков сделать, хотя отличаться он не будет:
C#
1
2
3
4
5
6
7
    public static class EventExtender
    {
        public static bool IsSubscribed(this Delegate @event, Delegate eventHandler)
        {
            return @event.GetInvocationList().Contains(eventHandler);
        }
    }
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 13:14  [ТС]
Что-то я не врубаюсь, почему у меня не работает это.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 13:15  [ТС]
C#
1
var handler = _animation.Completed;
Не прокатит
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2014, 13:16
Casper-SC, да, я уже понял. Ну тогда действительно через рефлексию надо. Хотя можно еще подумать)
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 13:19  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Casper-SC, да, я уже понял. Ну тогда действительно через рефлексию надо. Хотя можно еще подумать)
Да вот создал проект, подключил WindowsBase.dll и PresentationCore.dll и сижу клацаю с разными флагами, толку ноль . Такой жёсткий подход
C#
1
2
3
4
5
6
7
8
9
10
    class Program
    {
        static void Main(string[] args)
        {
            FieldInfo fInfo = typeof(Clock).GetField("Completed", BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic);
            if (fInfo == null)
                return;
 
            Console.ReadKey();
        }
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2014, 13:35
Casper-SC, готово
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
using System;
using System.Linq;
using System.Reflection;
 
namespace ConsoleApplication20
{
    public static class EventExtender
    {
        const BindingFlags Flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
        public static bool IsSubscribed(this Delegate @event, Delegate eventHandler)
        {
            return @event.GetInvocationList().Contains(eventHandler);
        }
 
        public static bool IsSubscribed<T>(this T eventOwner, string eventName, Delegate eventHandler)
        {
            var type = eventOwner.Equals(null) ? typeof (T) : eventOwner.GetType();
            var fieldInfo = type.GetField(eventName, Flags);
            if (fieldInfo == null)
                throw new ArgumentException("Invalid event name", "eventName");
            var del = (MulticastDelegate) fieldInfo.GetValue(eventName);
            return del.IsSubscribed(eventHandler);
        }
    }
}
Добавлено через 33 секунды
Если метод статический, то вызывать через null, иначе вызывать как экстеншн для того объекта, для которого хотим получить :
C#
1
2
3
4
5
6
7
8
9
10
        static void Main()
        {
            EventHandler ev1 = (sender, eventArgs) => Console.WriteLine("Hello");
            EventHandler ev2 = (sender, eventArgs) => Console.WriteLine("World");
            EventHandler ev3 = (sender, eventArgs) => Console.WriteLine("I'm not in the list");
            MyEvent += ev1;
            MyEvent += ev2;
 
            Console.WriteLine(EventExtender.IsSubscribed<Program>(null, "MyEvent", ev2));
        }
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 13:52  [ТС]
Я наверное что-то не так делаю, на этом примере можно сделать проверку наличия орбработчика у события Completed? Там где закомментирован код.
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
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Media.Animation;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Something some = new Something();
            some.BeginForeverAnimationWithPause(new Duration(TimeSpan.FromMilliseconds(500)));
 
            //Во время второго вызова нужно проверить сразу не подписан ли _animation.Completed на метод обработчик,
            //иначе анимация уже работает не правильно
            some.BeginForeverAnimationWithPause(new Duration(TimeSpan.FromMilliseconds(1000)));
 
            Console.ReadKey();
        }
    }
 
    class Something
    {
        private Int32Animation _animation;
        private Duration _duration;
 
        public void BeginForeverAnimationWithPause(Duration duration, bool pause = false)
        {
            //var handler = _animation.Completed;
            //if (IsSubscribed(_animation.Completed, ForeverAnimationWithPause_Completed))
 
            _animation.Completed -= ForeverAnimationWithPause_Completed;
            _animation = new Int32Animation(0, 10, duration);
            _animation.Completed += ForeverAnimationWithPause_Completed;
        }
 
        private void ForeverAnimationWithPause_Completed(object sender, EventArgs e)
        {
            var animation = (AnimationClock)sender;
            animation.Completed -= ForeverAnimationWithPause_Completed;
            _animation = new Int32Animation(0, 10, _duration);
            _animation.RepeatBehavior = RepeatBehavior.Forever;
        } 
    }
 
    public static class EventExtender
    {
        const BindingFlags Flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
 
        public static bool IsSubscribed(this Delegate @event, Delegate eventHandler)
        {
            return @event.GetInvocationList().Contains(eventHandler);
        }
 
        public static bool IsSubscribed<T>(this T eventOwner, string eventName, Delegate eventHandler)
        {
            var fieldInfo = typeof(T).GetField(eventName, Flags);
            var del = (MulticastDelegate)fieldInfo.GetValue(eventName);
            return del.IsSubscribed(eventHandler);
        }
    }
}
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 13:54  [ТС]
Вот как определено событие, может что-то это даст...
Миниатюры
Как узнать, что на событие подписан метод обработчик?  
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2014, 13:57
Casper-SC, нужно просто _animation передавать..
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 14:07  [ТС]
C#
1
2
3
            var eventHandler = (EventHandler)ForeverAnimationWithPause_Completed;
            if (_animation.IsSubscribed("Completed", eventHandler))
                _animation.Completed -= ForeverAnimationWithPause_Completed;
Не работает. Всё равно null на этой строке:
C#
1
 var fieldInfo = typeof(T).GetField(eventName, Flags);
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2014, 14:08
Casper-SC, попробуй GetProperty.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 14:09  [ТС]
Вот на чём можно у себя проверить, что я не делаю, не работает и всё.
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
63
64
65
66
67
68
69
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Windows;
using System.Windows.Media.Animation;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Something some = new Something();
            some.BeginForeverAnimationWithPause(new Duration(TimeSpan.FromMilliseconds(500)));
 
            //Во время второго вызова нужно проверить сразу не подписан ли _animation.Completed на метод обработчик,
            //иначе анимация уже работает не правильно
            some.BeginForeverAnimationWithPause(new Duration(TimeSpan.FromMilliseconds(1000)));
 
            Console.ReadKey();
        }
    }
 
    class Something
    {
        private Int32Animation _animation;
        private Duration _duration;
 
        public void BeginForeverAnimationWithPause(Duration duration, bool pause = false)
        {
            _animation = new Int32Animation(0, 10, duration);
            _animation.Completed += ForeverAnimationWithPause_Completed;
 
            var eventHandler = (EventHandler)ForeverAnimationWithPause_Completed;
            if (_animation.IsSubscribed("Completed", eventHandler))
                _animation.Completed -= ForeverAnimationWithPause_Completed;
 
            //Type clockType = typeof(Clock);
            //EventInfo e = clockType.GetEvent("Completed");
        }
 
        private void ForeverAnimationWithPause_Completed(object sender, EventArgs e)
        {
            var animation = (AnimationClock)sender;
            animation.Completed -= ForeverAnimationWithPause_Completed;
            _animation = new Int32Animation(0, 10, _duration);
            _animation.RepeatBehavior = RepeatBehavior.Forever;
        }
    }
 
    public static class EventExtender
    {
        const BindingFlags Flags = BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
 
        public static bool IsSubscribed(this Delegate @event, Delegate eventHandler)
        {
            return @event.GetInvocationList().Contains(eventHandler);
        }
 
        public static bool IsSubscribed<T>(this T eventOwner, string eventName, Delegate eventHandler)
        {
            var fieldInfo = typeof(T).GetField(eventName, Flags);
            var del = (MulticastDelegate)fieldInfo.GetValue(eventName);
            return del.IsSubscribed(eventHandler);
        }
    }
}
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.03.2014, 14:11
http://stackoverflow.com/quest... subscribed
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
09.03.2014, 15:34
А если так попробовать

Кликните здесь для просмотра всего текста
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
63
64
65
66
67
68
69
70
71
public class Int32AnimationT : Int32Animation
    {
        private EventHandler _completed;
 
        public Int32AnimationT()
        {
        }
 
        public Int32AnimationT(int toValue, Duration duration) : base(toValue, duration)
        {
        }
 
        public Int32AnimationT(int toValue, Duration duration, FillBehavior fillBehavior)
            : base(toValue, duration, fillBehavior)
        {
        }
 
        public Int32AnimationT(int fromValue, int toValue, Duration duration) : base(fromValue, toValue, duration)
        {
        }
 
        public Int32AnimationT(int fromValue, int toValue, Duration duration, FillBehavior fillBehavior)
            : base(fromValue, toValue, duration, fillBehavior)
        {
        }
 
        public new event EventHandler Completed
        {
            add
            {
                Completed += value;
                _completed += value;
            }
            remove
            {
                Completed -= value;
                _completed -= value;
            }
        }
 
        public bool IsSubscribed()
        {
            return _completed != null;
        }
    }
 
    internal class Something
    {
        private Int32AnimationT _animation;
        private Duration _duration;
 
        public void BeginForeverAnimationWithPause(Duration duration, bool pause = false)
        {
            _animation = new Int32AnimationT(0, 10, duration);
            _animation.Completed += ForeverAnimationWithPause_Completed;
            
            if (_animation.IsSubscribed())
                _animation.Completed -= ForeverAnimationWithPause_Completed;
 
            //Type clockType = typeof(Clock);
            //EventInfo e = clockType.GetEvent("Completed");
        }
 
        private void ForeverAnimationWithPause_Completed(object sender, EventArgs e)
        {
            var animation = (AnimationClock) sender;
            animation.Completed -= ForeverAnimationWithPause_Completed;
            _animation = new Int32AnimationT(0, 10, _duration);
            _animation.RepeatBehavior = RepeatBehavior.Forever;
        }
    }
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
09.03.2014, 18:10  [ТС]
Цитата Сообщение от Grishaco Посмотреть сообщение
А если так попробовать
Не, не охота наследника все свойства переопределять и т.д., долго, муторно. В принципе, я просто сделал bool переменную и по ней смотрю подписан ли на событие. Лишнее поле в наследнике от Image (Image с возможностью проигрывания анимации из png картинок, к примеру). Идею всё равно использовал. Всё заработало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.03.2014, 18:10
Помогаю со студенческими работами здесь

Как узнать, произошло ли событие?
Добрый день! Подскажите, пожалуйста, как узнать, произошло ли событие. Надо изменить Discount, если изменится Total. (на отсутствие Price...

Как узнать, какой контролл вызвал событие
У меня есть 12 panel'ей. Они объединены в массив. Как бы мне сделать так, чтобы при нажатии на i-ую панель вылезало, ну, к примеру,...

Как узнать название объекта, вызвавшего событие?
Вроде простой вопрос, но поиск не помог. Есть два NumericUpDown, у обоих одна функция на KeyDown. Как внутри события получить название...

Как узнать, что картинка полностью загружена, чтобы узнать её размеры
Здраствуйте ! Делаю галерею. Мне нужно узнать когда картинка загрузица полносттю, чтобы узнать её размеры. Подскажыте, читал ето делаеца...

Как узнать какой скрипт обрабатывает событие на элементе?
Например есть кнопка по клике на которой выводится модальное окно. Как с помощью firebug узнать какой код привязан к этой кнопке?.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru