Browse Source

Fix #3333: Clicking does not select in Assemblies pane when it doesn't have focus

pull/3335/head
tom-englert 9 months ago
parent
commit
446ce3174b
  1. 6
      ILSpy/AssemblyTree/AssemblyListPane.xaml.cs
  2. 1
      ILSpy/AssemblyTree/AssemblyTreeModel.cs
  3. 9
      ILSpy/Controls/TreeView/SharpTreeView.cs

6
ILSpy/AssemblyTree/AssemblyListPane.xaml.cs

@ -23,6 +23,7 @@ using System.Windows.Threading;
using ICSharpCode.ILSpy.ViewModels; using ICSharpCode.ILSpy.ViewModels;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
using TomsToolbox.Wpf;
using TomsToolbox.Wpf.Composition.AttributedModel; using TomsToolbox.Wpf.Composition.AttributedModel;
namespace ICSharpCode.ILSpy.AssemblyTree namespace ICSharpCode.ILSpy.AssemblyTree
@ -56,7 +57,7 @@ namespace ICSharpCode.ILSpy.AssemblyTree
var selected = model.SelectedItem; var selected = model.SelectedItem;
if (selected != null) if (selected != null)
{ {
this.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => { this.BeginInvoke(DispatcherPriority.Background, () => {
ScrollIntoView(selected); ScrollIntoView(selected);
this.SelectedItem = selected; this.SelectedItem = selected;
}); });
@ -69,7 +70,8 @@ namespace ICSharpCode.ILSpy.AssemblyTree
if (SelectedItem is SharpTreeNode selectedItem) if (SelectedItem is SharpTreeNode selectedItem)
{ {
FocusNode(selectedItem); // defer focusing, so it does not interfere with selection via mouse click
this.BeginInvoke(() => FocusNode(selectedItem));
} }
else else
{ {

1
ILSpy/AssemblyTree/AssemblyTreeModel.cs

@ -640,6 +640,7 @@ namespace ICSharpCode.ILSpy.AssemblyTree
private void JumpToReference(object? sender, NavigateToReferenceEventArgs e) private void JumpToReference(object? sender, NavigateToReferenceEventArgs e)
{ {
JumpToReferenceAsync(e.Reference, e.InNewTabPage).HandleExceptions(); JumpToReferenceAsync(e.Reference, e.InNewTabPage).HandleExceptions();
IsActive = true;
} }
/// <summary> /// <summary>

9
ILSpy/Controls/TreeView/SharpTreeView.cs

@ -30,6 +30,8 @@ using System.Windows.Threading;
using ICSharpCode.ILSpyX.TreeView; using ICSharpCode.ILSpyX.TreeView;
using TomsToolbox.Wpf;
namespace ICSharpCode.ILSpy.Controls.TreeView namespace ICSharpCode.ILSpy.Controls.TreeView
{ {
public class SharpTreeView : ListView public class SharpTreeView : ListView
@ -396,9 +398,10 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
/// </summary> /// </summary>
public void FocusNode(SharpTreeNode node) public void FocusNode(SharpTreeNode node)
{ {
if (node == null) ArgumentNullException.ThrowIfNull(node);
throw new ArgumentNullException("node");
ScrollIntoView(node); ScrollIntoView(node);
// WPF's ScrollIntoView() uses the same if/dispatcher construct, so we call OnFocusItem() after the item was brought into view. // 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) if (this.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{ {
@ -406,7 +409,7 @@ namespace ICSharpCode.ILSpy.Controls.TreeView
} }
else else
{ {
this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new DispatcherOperationCallback(this.OnFocusItem), node); this.BeginInvoke(DispatcherPriority.Loaded, () => OnFocusItem(node));
} }
} }

Loading…
Cancel
Save