作为此问题的后续内容(https://stackoverflow.com/questions/28567211/how-to-log-control-hierarchy-in-net),是否有任何全局方法可以捕获Silverlight或ASP.NET中的所有点击事件?
我基本上问是否有某种方法来附加全局点击事件处理程序,以便我可以针对处理点击事件的所有控件捕获的每个点击事件运行一些代码,而不必手动将事件处理程序添加到每个控件
如果可以的话,我想知道如何在不必为每个控件手动添加事件处理程序的情况下完成此操作。我有一个想法是来自顶级的ASP.NET页面或Silverlight应用程序来遍历整个Control树,寻找ButtonBase控件(或ASP.NET中的等价物)并为click事件添加一个新的事件处理程序。但是,我不喜欢穿越整棵树并以这种方式行事的想法。我想在Silverlight中它不会那么糟糕,因为它只需要在加载应用程序时完成,但是使用ASP.NET我会想象它会在每个PostBack上发生吗?
它看起来像System.Windows.EventManager.RegisterClassHandler()会这样做,但我不相信我可以在Silverlight或ASP.NET中的任何等效文件中访问它。
答案 0 :(得分:1)
在Silverlight中,您可以将mouseClick事件处理程序附加到UI树RootElement。您不需要遍历树,鼠标点击事件会冒泡整个树 - 即使它们由中间节点处理。如果你想捕获已经处理的事件,你必须在附加处理程序时指定它(请参阅下面代码中的bool param)。
...
var root = System.Windows.Application.Current.RootVisual;
MouseButtonEventHandler handler = HandleRootMouseLeftButtonDown;
root.AddHandler(UIElement.MouseLeftButtonDownEvent, handler, true);
...
private void HandleRootMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// do some magic...
}