2015-10-26 3 views
-1

У меня есть более 600 страниц, у всех есть кнопка отмены, и все они вызывают одну строку Response.Redirect("~/Default.aspx"); для перехода на главный экран , Все страницы наследуются от базовой страницы, и я не уверен, почему нажатие кнопки не было просто определено на базовой странице, поскольку все это было на месте, прежде чем я начал работать над ней.Можно ли сделать событие нажатия кнопки на родительской странице иметь приоритет над событием на дочерней странице

Я пытаюсь переместить событие нажатия кнопки на базовую страницу, потому что вместо того, чтобы всегда идти в корень сайта, теперь нужно перейти к одному из четырех экранов дома в зависимости от области сайта, которую пользователь в настоящее время, поэтому мне нужно выполнить некоторые функции до того, как произойдет перенаправление.

Я знаю, что я могу просто удалить событие нажатия кнопки со страниц и добавить его на базовую страницу, но это означает, что вы тратите на более чем 600 страниц, так что мне было интересно, если можно добавить событие нажатия кнопки на базовую страницу и сделать ее переопределением любого события на реальной странице, поэтому мне не нужно их удалять. Просто добавление события на базовую страницу не работает, так как всегда кажется, что он запускает событие страницы и даже не смотрит на базовую страницу.

Я попытался добавить рекурсивную FindControl петли на базовую странице событий OnInit и OnLoad найти кнопку и переопределить Button.PostBackUrl, но оказывается, что цикл через управление вызывает проблемы в других областях. Это проблема еще на один день!

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

Любая помощь будет оценена по достоинству. Thanks

+0

Имеет ли обратная кнопка общее имя. Если это так, вы можете использовать javascript, чтобы отключить кнопку в init и показать только одну из вашей базовой страницы. – XtremeBytes

+0

@XtremeBytes Привет, спасибо за ваш ответ. Да, все они имеют общее имя, но дело в том, что я не хочу отключать кнопку, я просто хочу изменить событие, которое он называет кликом. Я хочу использовать ту же кнопку – Sukhy

+0

OOP не работает в этом направлении. Ребенок наследуется от родителя. Следовательно, ребенок может переопределить то, что он унаследовал от своего родителя, но родитель не может переопределить ребенка. (Возможно, ребенок даже не существует.) Возможно, вы сможете уйти с маркировкой метода как «запечатанный» в базовом классе. Это предотвратит его переопределение, но я подозреваю, что существующая архитектура не будет поддерживать это без каких-либо изменений, которые вы хотите избежать. – DeadZone

ответ

0

Что вы хотите сделать, это перехватить сообщения WM_MOUSE, отправляемые на кнопки. В окнах это называется крючком, с помощью крючка вы можете сказать, что хотите получить сообщение Windows, прежде чем кто-то его получит. Вы можете исследовать сообщение и принять решение отправить сообщение в исходное место назначения или удержать сообщение. В этом случае исходное место назначения не получит сообщение Windows и не заметит, что нажата кнопка.

Подключиться к цепочке сообщений, используя SetWindowsHookEx в win32.dll. Это очень низкий уровень и, следовательно, небезопасный код. Есть несколько вопросов о StackOverflow о SetWindowsHookEx, CallNextHookEx, UnhookWindowsHookEx, но я не мог найти пример, который работает на полке.

Microsoft имеет простой пример о том, как это сделать.
How to set a Windows hook in Visual C# .NET

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

Чтобы избавиться от устаревшей функции изменить следующие

hHook = SetWindowsHookEx(WH_MOUSE, 
      MouseHookProcedure, 
      (IntPtr)0, 
      AppDomain.GetCurrentThreadId()); <== obsolete 

надо заменить:

ProcessThread runningThread = Process.GetCurrentProcess().Threads 
    .OfType<ProcessThread>() 
    .SingleOrDefault(thread => thread.ThreadState == ThreadState.Running); 
    if (runningThread != null) 
    { 
     hHook = SetWindowsHookEx(WH_MOUSE, 
      MouseHookProcedure, 
      (IntPtr)0, 
      runningThread.Id); // <== works ok 
    } 

Hooking и расцепления является довольно сложным процессом. К счастью NuGet пакет делает трудности для вас:

Nuget Package MouseHook

Используя этот пакет вы получите события, когда какое-либо событие мыши происходит в вашем приложении, прежде чем элемент управления получает событие.С каждым событием вы можете решить, хотите ли вы, чтобы элемент управления получил сообщение или что вы хотите что-то сделать вместо этого, и проглотите это сообщение. См. Пример в MouseHook

+0

awesome! спасибо за это, это похоже на хороший вариант попробовать. очень признателен – Sukhy

Смежные вопросы