From 446ce3174bdf3c273748c8cd4861ad1f9bf052a5 Mon Sep 17 00:00:00 2001 From: tom-englert Date: Sun, 17 Nov 2024 11:29:12 +0100 Subject: [PATCH] Fix #3333: Clicking does not select in Assemblies pane when it doesn't have focus --- ILSpy/AssemblyTree/AssemblyListPane.xaml.cs | 6 ++++-- ILSpy/AssemblyTree/AssemblyTreeModel.cs | 1 + ILSpy/Controls/TreeView/SharpTreeView.cs | 9 ++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/ILSpy/AssemblyTree/AssemblyListPane.xaml.cs b/ILSpy/AssemblyTree/AssemblyListPane.xaml.cs index af7b14a918..2e9844d23b 100644 --- a/ILSpy/AssemblyTree/AssemblyListPane.xaml.cs +++ b/ILSpy/AssemblyTree/AssemblyListPane.xaml.cs @@ -23,6 +23,7 @@ using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpyX.TreeView; +using TomsToolbox.Wpf; using TomsToolbox.Wpf.Composition.AttributedModel; namespace ICSharpCode.ILSpy.AssemblyTree @@ -56,7 +57,7 @@ protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) var selected = model.SelectedItem; if (selected != null) { - this.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => { + this.BeginInvoke(DispatcherPriority.Background, () => { ScrollIntoView(selected); this.SelectedItem = selected; }); @@ -69,7 +70,8 @@ protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) if (SelectedItem is SharpTreeNode selectedItem) { - FocusNode(selectedItem); + // defer focusing, so it does not interfere with selection via mouse click + this.BeginInvoke(() => FocusNode(selectedItem)); } else { diff --git a/ILSpy/AssemblyTree/AssemblyTreeModel.cs b/ILSpy/AssemblyTree/AssemblyTreeModel.cs index 3155b29b07..11df013904 100644 --- a/ILSpy/AssemblyTree/AssemblyTreeModel.cs +++ b/ILSpy/AssemblyTree/AssemblyTreeModel.cs @@ -640,6 +640,7 @@ public void SelectNodes(IEnumerable nodes) private void JumpToReference(object? sender, NavigateToReferenceEventArgs e) { JumpToReferenceAsync(e.Reference, e.InNewTabPage).HandleExceptions(); + IsActive = true; } /// diff --git a/ILSpy/Controls/TreeView/SharpTreeView.cs b/ILSpy/Controls/TreeView/SharpTreeView.cs index 4c99b4b458..6215f9bffe 100644 --- a/ILSpy/Controls/TreeView/SharpTreeView.cs +++ b/ILSpy/Controls/TreeView/SharpTreeView.cs @@ -30,6 +30,8 @@ using ICSharpCode.ILSpyX.TreeView; +using TomsToolbox.Wpf; + namespace ICSharpCode.ILSpy.Controls.TreeView { public class SharpTreeView : ListView @@ -396,9 +398,10 @@ void ExpandRecursively(SharpTreeNode node) /// public void FocusNode(SharpTreeNode node) { - if (node == null) - throw new ArgumentNullException("node"); + ArgumentNullException.ThrowIfNull(node); + ScrollIntoView(node); + // WPF's ScrollIntoView() uses the same if/dispatcher construct, so we call OnFocusItem() after the item was brought into view. if (this.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated) { @@ -406,7 +409,7 @@ public void FocusNode(SharpTreeNode node) } else { - this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new DispatcherOperationCallback(this.OnFocusItem), node); + this.BeginInvoke(DispatcherPriority.Loaded, () => OnFocusItem(node)); } }