Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit d3b561d

Browse files
authored
Merge pull request #1054 from github/fixes/1042-pr-details-scrolling
Prevent PR details auto-scolling to top.
2 parents 70920e7 + 78eb721 commit d3b561d

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

src/GitHub.UI/GitHub.UI.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
<Compile Include="Helpers\LoadingResourceDictionary.cs" />
101101
<Compile Include="Helpers\ScrollViewerUtilities.cs" />
102102
<Compile Include="Helpers\SharedDictionaryManager.cs" />
103+
<Compile Include="Helpers\TreeViewExtensions.cs" />
103104
<Compile Include="Resources.Designer.cs">
104105
<AutoGen>True</AutoGen>
105106
<DesignTime>True</DesignTime>
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System;
2+
using System.Windows.Controls;
3+
4+
namespace GitHub.UI.Helpers
5+
{
6+
/// <summary>
7+
/// Extensions for TreeView control.
8+
/// </summary>
9+
public static class TreeViewExtensions
10+
{
11+
/// <summary>
12+
/// Gets the TreeViewItem for an item in the TreeView.
13+
/// </summary>
14+
/// <param name="tree">The tree view.</param>
15+
/// <param name="item">The item to search for.</param>
16+
/// <returns>The TreeViewItem or null if the item was null or not found.</returns>
17+
public static TreeViewItem GetTreeViewItem(this TreeView tree, object item)
18+
{
19+
if (item == null)
20+
{
21+
return null;
22+
}
23+
24+
return GetTreeViewItem(tree.ItemContainerGenerator, item);
25+
}
26+
27+
static TreeViewItem GetTreeViewItem(ItemContainerGenerator itemContainerGenerator, object item)
28+
{
29+
var container = (TreeViewItem)itemContainerGenerator.ContainerFromItem(item);
30+
31+
if (container == null)
32+
{
33+
foreach (var childItem in itemContainerGenerator.Items)
34+
{
35+
var node = (TreeViewItem)itemContainerGenerator.ContainerFromItem(childItem);
36+
container = GetTreeViewItem(node.ItemContainerGenerator, item);
37+
38+
if (container != null)
39+
{
40+
return container;
41+
}
42+
}
43+
}
44+
45+
return container;
46+
}
47+
}
48+
}

src/GitHub.VisualStudio/UI/Views/PullRequestDetailView.xaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@
236236
<Rectangle DockPanel.Dock="Top" Style="{StaticResource Separator}" Height="2" Margin="-8,5,-8,0"/>
237237

238238
<ScrollViewer VerticalScrollBarVisibility="Auto" Margin="0,0,-8,0">
239-
<Grid Margin="0 5 0 0">
239+
<Grid Name="bodyGrid" Margin="0 5 0 0">
240240
<Grid.ColumnDefinitions>
241241
<ColumnDefinition Width="*"/>
242242
</Grid.ColumnDefinitions>
@@ -297,7 +297,8 @@
297297
</Grid.Resources>
298298

299299
<!-- Tree View -->
300-
<TreeView ItemsSource="{Binding ChangedFilesTree}"
300+
<TreeView Name="changesTree"
301+
ItemsSource="{Binding ChangedFilesTree}"
301302
ContextMenuOpening="TreeView_ContextMenuOpening"
302303
ContextMenu="{StaticResource FileContextMenu}"
303304
Background="Transparent"

src/GitHub.VisualStudio/UI/Views/PullRequestDetailView.xaml.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using ReactiveUI;
2525
using Task = System.Threading.Tasks.Task;
2626
using GitHub.InlineReviews.Commands;
27+
using GitHub.UI.Helpers;
2728

2829
namespace GitHub.VisualStudio.UI.Views
2930
{
@@ -47,6 +48,8 @@ public PullRequestDetailView()
4748
d(ViewModel.OpenFile.Subscribe(x => DoOpenFile((IPullRequestFileNode)x)));
4849
d(ViewModel.DiffFile.Subscribe(x => DoDiffFile((IPullRequestFileNode)x).Forget()));
4950
});
51+
52+
bodyGrid.RequestBringIntoView += BodyFocusHack;
5053
}
5154

5255
[Import]
@@ -197,6 +200,18 @@ void ApplyContextMenuBinding<TItem>(object sender, ContextMenuEventArgs e) where
197200
}
198201
}
199202

203+
void BodyFocusHack(object sender, RequestBringIntoViewEventArgs e)
204+
{
205+
if (e.TargetObject == bodyMarkdown)
206+
{
207+
// Hack to prevent pane scrolling to top. Instead focus selected tree view item.
208+
// See https://github.com/github/VisualStudio/issues/1042
209+
var node = changesTree.GetTreeViewItem(changesTree.SelectedItem);
210+
node?.Focus();
211+
e.Handled = true;
212+
}
213+
}
214+
200215
void ViewCommentsClick(object sender, RoutedEventArgs e)
201216
{
202217
var model = (object)ViewModel.Model;

0 commit comments

Comments
 (0)