Proper scrolling and formatting for the ChatPanel.

- Users are blue, server is dark blue.
- Autoscroll when it's scrolled to the bottom, else leave it alone.
This commit is contained in:
Westin Miller
2017-09-07 02:54:10 -07:00
parent cfda1f8eef
commit d20d68b831
2 changed files with 23 additions and 25 deletions

View File

@@ -10,20 +10,9 @@
<RowDefinition/> <RowDefinition/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<ListView Grid.Row="0" x:Name="ChatItems" ItemsSource="{Binding ChatHistory}" Margin="5,5,5,5"> <ScrollViewer x:Name="ChatScroller" Grid.Row="0" Margin="5,5,5,5" HorizontalScrollBarVisibility="Disabled">
<ScrollViewer HorizontalScrollBarVisibility="Disabled"/> <TextBlock x:Name="ChatItems" />
<ListView.ItemTemplate> </ScrollViewer>
<DataTemplate>
<WrapPanel>
<TextBlock Text="{Binding Timestamp}"/>
<TextBlock Text=" "/>
<TextBlock Text="{Binding Name}" FontWeight="Bold"/>
<TextBlock Text=": "/>
<TextBlock Text="{Binding Message}"/>
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Grid Grid.Row="1"> <Grid Grid.Row="1">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition/> <ColumnDefinition/>

View File

@@ -41,23 +41,32 @@ namespace Torch.Server
{ {
_server = (TorchBase)server; _server = (TorchBase)server;
_multiplayer = (MultiplayerManager)server.Multiplayer; _multiplayer = (MultiplayerManager)server.Multiplayer;
ChatItems.Items.Clear();
DataContext = _multiplayer; DataContext = _multiplayer;
ChatItems.Inlines.Clear();
_multiplayer.ChatHistory.ForEach(InsertMessage);
if (_multiplayer.ChatHistory is INotifyCollectionChanged ncc) if (_multiplayer.ChatHistory is INotifyCollectionChanged ncc)
ncc.CollectionChanged += ChatHistory_CollectionChanged; ncc.CollectionChanged += ChatHistory_CollectionChanged;
ChatScroller.ScrollToBottom();
} }
private void ChatHistory_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) private void ChatHistory_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{ {
ChatItems.ScrollToItem(ChatItems.Items.Count - 1); foreach (IChatMessage msg in e.NewItems)
/* InsertMessage(msg);
if (VisualTreeHelper.GetChildrenCount(ChatItems) > 0) }
{
private void InsertMessage(IChatMessage msg)
Border border = (Border)VisualTreeHelper.GetChild(ChatItems, 0); {
ScrollViewer scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(border, 0); bool atBottom = ChatScroller.VerticalOffset + 8 > ChatScroller.ScrollableHeight;
scrollViewer.ScrollToBottom(); var span = new Span();
}*/ span.Inlines.Add($"{msg.Timestamp} ");
span.Inlines.Add(new Run(msg.Name) { Foreground = msg.Name == "Server" ? Brushes.DarkBlue : Brushes.Blue });
span.Inlines.Add($": {msg.Message}");
span.Inlines.Add(new LineBreak());
ChatItems.Inlines.Add(span);
if (atBottom)
ChatScroller.ScrollToBottom();
} }
private void SendButton_Click(object sender, RoutedEventArgs e) private void SendButton_Click(object sender, RoutedEventArgs e)
@@ -81,7 +90,7 @@ namespace Torch.Server
var commands = _server.Commands; var commands = _server.Commands;
if (commands.IsCommand(text)) if (commands.IsCommand(text))
{ {
_multiplayer.ChatHistory.Add(new ChatMessage(DateTime.Now, 0, "Server", text)); _multiplayer.ChatHistory.Add(new ChatMessage(DateTime.Now, 0, "Server", text));
_server.Invoke(() => _server.Invoke(() =>
{ {
var response = commands.HandleCommandFromServer(text); var response = commands.HandleCommandFromServer(text);