From 34285261cc441b3aabac507b3ae885eb96b1ddd2 Mon Sep 17 00:00:00 2001 From: Logan George Date: Mon, 9 Feb 2026 18:17:04 -0800 Subject: [PATCH 1/3] add horizontal scrolling to eventviewer --- src/PerfView/EventViewer/EventWindow.xaml | 1 + src/PerfView/EventViewer/EventWindow.xaml.cs | 35 ++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/PerfView/EventViewer/EventWindow.xaml b/src/PerfView/EventViewer/EventWindow.xaml index 600d963f8..74526fd49 100644 --- a/src/PerfView/EventViewer/EventWindow.xaml +++ b/src/PerfView/EventViewer/EventWindow.xaml @@ -249,6 +249,7 @@ ToolTip="Click on Update button to update." SelectionMode="Extended" SelectionUnit="CellOrRowHeader" SelectedCellsChanged="SelectedCellsChanged" + PreviewMouseWheel="Grid_PreviewMouseWheel" AlternatingRowBackground="{DynamicResource AlternateRowBackground}" AutomationProperties.Name="Events Table" ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}"> diff --git a/src/PerfView/EventViewer/EventWindow.xaml.cs b/src/PerfView/EventViewer/EventWindow.xaml.cs index eb75b16ec..53ecbf082 100644 --- a/src/PerfView/EventViewer/EventWindow.xaml.cs +++ b/src/PerfView/EventViewer/EventWindow.xaml.cs @@ -2001,5 +2001,40 @@ private void DoHideTimeStampColumns(object sender, RoutedEventArgs e) // Save preference App.UserConfigData["EventWindowShowTimeStampColumns"] = "false"; } + + /// + /// When Shift is held, redirect mouse wheel events to horizontal scrolling. + /// + private void Grid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) + { + if (Keyboard.Modifiers == ModifierKeys.Shift) + { + var scrollViewer = FindVisualChild((DependencyObject)sender); + if (scrollViewer != null) + { + scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset - e.Delta); + e.Handled = true; + } + } + } + + private static T FindVisualChild(DependencyObject parent) where T : DependencyObject + { + for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) + { + DependencyObject child = VisualTreeHelper.GetChild(parent, i); + if (child is T found) + { + return found; + } + + T result = FindVisualChild(child); + if (result != null) + { + return result; + } + } + return null; + } } } From ff13684be7e2155560c3d33dcf81526d0a199247 Mon Sep 17 00:00:00 2001 From: Logan George Date: Tue, 17 Feb 2026 16:48:05 -0800 Subject: [PATCH 2/3] cache scrollviewer --- src/PerfView/EventViewer/EventWindow.xaml.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/PerfView/EventViewer/EventWindow.xaml.cs b/src/PerfView/EventViewer/EventWindow.xaml.cs index 53ecbf082..76bc0ed6d 100644 --- a/src/PerfView/EventViewer/EventWindow.xaml.cs +++ b/src/PerfView/EventViewer/EventWindow.xaml.cs @@ -1915,6 +1915,7 @@ private void Add(ObservableCollection events, EventRecord event_) private List m_userDefinedColumns; private float[] m_buckets; // Keep track of the counts of events. private double m_bucketTimeMSec; // Size for each bucket + private ScrollViewer m_gridScrollViewer; // Cached ScrollViewer for horizontal scrolling #endregion private void DoUseLocalTime(object sender, RoutedEventArgs e) @@ -2009,10 +2010,15 @@ private void Grid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Shift) { - var scrollViewer = FindVisualChild((DependencyObject)sender); - if (scrollViewer != null) + // Cache the ScrollViewer on first use + if (m_gridScrollViewer == null) { - scrollViewer.ScrollToHorizontalOffset(scrollViewer.HorizontalOffset - e.Delta); + m_gridScrollViewer = FindVisualChild((DependencyObject)sender); + } + + if (m_gridScrollViewer != null) + { + m_gridScrollViewer.ScrollToHorizontalOffset(m_gridScrollViewer.HorizontalOffset - e.Delta); e.Handled = true; } } From 5db1845c34479874c2904a2c6ceaae5d8c5a6e49 Mon Sep 17 00:00:00 2001 From: Logan George Date: Wed, 18 Feb 2026 15:17:52 -0800 Subject: [PATCH 3/3] improve cache hit path efficiency --- src/PerfView/EventViewer/EventWindow.xaml.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/PerfView/EventViewer/EventWindow.xaml.cs b/src/PerfView/EventViewer/EventWindow.xaml.cs index 76bc0ed6d..d75ff1a86 100644 --- a/src/PerfView/EventViewer/EventWindow.xaml.cs +++ b/src/PerfView/EventViewer/EventWindow.xaml.cs @@ -2014,13 +2014,14 @@ private void Grid_PreviewMouseWheel(object sender, MouseWheelEventArgs e) if (m_gridScrollViewer == null) { m_gridScrollViewer = FindVisualChild((DependencyObject)sender); + if (m_gridScrollViewer == null) + { + return; + } } - if (m_gridScrollViewer != null) - { - m_gridScrollViewer.ScrollToHorizontalOffset(m_gridScrollViewer.HorizontalOffset - e.Delta); - e.Handled = true; - } + m_gridScrollViewer.ScrollToHorizontalOffset(m_gridScrollViewer.HorizontalOffset - e.Delta); + e.Handled = true; } }