Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Yadanilov
0 / 0 / 1
Регистрация: 03.05.2014
Сообщений: 23
1

Вызов единственного обработчика события при переопределении

27.11.2014, 12:46. Просмотров 341. Ответов 2
Метки нет (Все метки)

Все привет! Вопрос по теории. Можно ли как-то сделать так, чтобы при перекрытии обработчика события вызывался он единственный?

Скажем у меня есть Canvas, на котором я динамически создаю кнопки, кликая по его области.
Выглядит примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
private void Canv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
                Point pos_mouse = e.GetPosition(Canv);
                Button new_el = new Button();
                var wigth = pos_mouse.X - new_el.Width / 2;
                var height = pos_mouse.Y - new_el.Height / 2;
                
                new_el.Margin = new Thickness(wigth, height, 0, 0);
                
                Canv.Children.Add(new_el);
}
Теперь я хочу, чтобы по клику на саму кнопку кнопка удалялась.
Делаю следующее:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void Canv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
                Point pos_mouse = e.GetPosition(Canv);
                Button new_el = new Button();
                var wigth = pos_mouse.X - new_el.Width / 2;
                var height = pos_mouse.Y - new_el.Height / 2;
                
                new_el.Margin = new Thickness(wigth, height, 0, 0);
                new_el.MouseLeftButtonDown += Close_Button;
              
                Canv.Children.Add(new_el);
}
 
private void Close_Button(object sender, MouseEventArgs e)
{
            Canv.Children.Remove(sender as Button);
}
И вот и подошли к проблеме: после вызова Close_Button у нас вызывается обработчик события для Canvas.
Как итог, получаем, что на месте удаленной кнопки создалась новая. Сразу хочу извиниться за "говнокодерство". Не опытный еще)
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 12:46
Ответы с готовыми решениями:

Отмена обработчика события
Я разрабатываю калькулятор (все через это прошли наверно). Когда я в поле для ввода ввожу цифру на...

Отладка обработчика события GotFocus
Требуется отладить обработчик события GotFocus у некоторого элемента. В интерфейсе пользователя...

Как обратится к форме из обработчика события?
есть слушатель на завершение: WebClient user = new WebClient(); user.DownloadFileCompleted += new...

Вызвать обработчик события внутри другого обработчика
У окна есть обработчик Loaded="Window_Loaded", который мониторит состояние всего окна. Нужно чтобы...

Лямбда обработчик события. Нужно вернуть значение вовне обработчика, во внешний код
Я хочу сделать как-то так: Uri GetUriBlaBlaBla() { var wb = new WebBrowser(); ...

2
Atobar
1 / 1 / 2
Регистрация: 25.06.2014
Сообщений: 19
27.11.2014, 13:12 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
void TestCanvas_MouseUp(object sender, MouseButtonEventArgs e)
{
       Point position = e.GetPosition(TestCanvas);
 
       Button btn = new Button()
       {
            Width = 80,
            Height = 25,
            Content = "Button"
       };
 
       var x = position.X - btn.Width / 2;
       var y = position.Y - btn.Height / 2;
 
       Canvas.SetLeft(btn, x);
       Canvas.SetTop(btn, y);
 
       btn.PreviewMouseUp += btn_PreviewMouseUp;
       TestCanvas.Children.Add(btn);
}
 
void btn_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
      TestCanvas.Children.Remove((Button)sender);
}
0
Yadanilov
0 / 0 / 1
Регистрация: 03.05.2014
Сообщений: 23
09.12.2014, 22:44  [ТС] 3
Спустя почти месяц нашел ответ. Нужно было в обработчике события присвоить событию значение true, для того чтобы это сообщение далее не обрабатывалось по маршрутизации (пузырьковой или туннельной).
В коде выглядит примерно так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void Canv_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
                Point pos_mouse = e.GetPosition(Canv);
                Button new_el = new Button();
                var wigth = pos_mouse.X - new_el.Width / 2;
                var height = pos_mouse.Y - new_el.Height / 2;
                
                new_el.Margin = new Thickness(wigth, height, 0, 0);
                new_el.MouseLeftButtonDown += Close_Button;
              
                Canv.Children.Add(new_el);
}
 
private void Close_Button(object sender, MouseEventArgs e)
{
            Canv.Children.Remove(sender as Button);
            
            e.Handled = true;
}
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2014, 22:44

Вызов обработчика события.
Можно ли из одного обработчика события, например: void __fastcall TForm1::Button1Click(TObject...

Вызов обработчика события
есть два обработчика события button1.Click и button2.Click . Как из button1.Click вызвать...

Вызов подпрограммы из обработчика события
Добрый день! Пишу простенькую программу "мигающий светодиод". Реализовал с использованием...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.