diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs index b10e199e26f..7dd434a08e7 100644 --- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs +++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs @@ -11,6 +11,7 @@ using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; using MS.Internal; +using MS.Internal.KnownBoxes; namespace System.Windows { @@ -193,27 +194,28 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais // Invoke listeners - if( TraceRoutedEvent.IsEnabled ) + var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled; + if ( traceRoutedEventIsEnabled ) { + _traceArguments ??= new object[3]; + _traceArguments[0] = _routeItemList[i].Target; + _traceArguments[1] = args; + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Start, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); - + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } _routeItemList[i].InvokeHandler(args); - if( TraceRoutedEvent.IsEnabled ) + if( traceRoutedEventIsEnabled ) { + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Stop, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } @@ -264,27 +266,29 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais } - if( TraceRoutedEvent.IsEnabled ) + var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled; + if ( traceRoutedEventIsEnabled ) { + _traceArguments ??= new object[3]; + _traceArguments[0] = _routeItemList[i].Target; + _traceArguments[1] = args; + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Start, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } // Invoke listeners _routeItemList[i].InvokeHandler(args); - if( TraceRoutedEvent.IsEnabled ) + if (traceRoutedEventIsEnabled) { + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Stop, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } } @@ -552,6 +556,9 @@ internal void Clear() // Stores Source Items for separated trees private FrugalStructList _sourceItemList; + // Stores arguments that are passed to TraceRoutedEvent.Trace (to reduce allocations) + private object[] _traceArguments; + #endregion Data } }