Skip to content

Commit 0d05e75

Browse files
committed
Retain scroll position of conversation view height changes
1 parent 78cea51 commit 0d05e75

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

Signal-Windows/Controls/Conversation.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@
110110
</Button>
111111
</Grid>
112112
</Border>
113-
<ListView Style="{StaticResource ConversationStyle}" Grid.Row="1" x:Name="ConversationItemsControl" VirtualizingStackPanel.VirtualizationMode="Recycling" Background="White" ScrollViewer.VerticalScrollBarVisibility="Visible" Padding="0 0 15 0" SelectionMode="None">
113+
<ListView Style="{StaticResource ConversationStyle}" Grid.Row="1" x:Name="ConversationItemsControl" VirtualizingStackPanel.VirtualizationMode="Recycling" Background="White" ScrollViewer.VerticalScrollBarVisibility="Visible" Padding="0 0 15 0" SelectionMode="None" SizeChanged="ConversationItemsControl_SizeChanged">
114114
<ListView.ItemContainerStyle>
115115
<Style TargetType="ListViewItem">
116116
<Setter Property="HorizontalContentAlignment" Value="Stretch" />

Signal-Windows/Controls/Conversation.xaml.cs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,31 @@ private async void UserInputBar_OnSendMessageButtonClicked()
344344
}
345345
}
346346

347+
private static ScrollViewer GetScrollViewer(DependencyObject element)
348+
{
349+
if (element is ScrollViewer)
350+
{
351+
return (ScrollViewer)element;
352+
}
353+
354+
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
355+
{
356+
var child = VisualTreeHelper.GetChild(element, i);
357+
358+
var result = GetScrollViewer(child);
359+
if (result == null)
360+
{
361+
continue;
362+
}
363+
else
364+
{
365+
return result;
366+
}
367+
}
368+
369+
return null;
370+
}
371+
347372
private void ScrollToUnread()
348373
{
349374
if (Collection.Count > 0)
@@ -515,5 +540,18 @@ private async void Grid_Drop(object sender, DragEventArgs e)
515540
}
516541
}
517542
}
543+
544+
private void ConversationItemsControl_SizeChanged(object sender, SizeChangedEventArgs e)
545+
{
546+
var scrollbar = GetScrollViewer(this);
547+
if (scrollbar != null)
548+
{
549+
var verticalDelta = e.PreviousSize.Height - e.NewSize.Height;
550+
if (verticalDelta > 0)
551+
{
552+
scrollbar.ChangeView(null, scrollbar.VerticalOffset + verticalDelta, null);
553+
}
554+
}
555+
}
518556
}
519557
}

0 commit comments

Comments
 (0)