private void OnViewSizeChanged(object sender, SizeChangedEventArgs e) { if (Messages.ScrollingHost.ScrollableHeight > 0) { return; } //Arrow.Visibility = Visibility.Collapsed; VisualUtilities.SetIsVisible(Arrow, false); ViewVisibleMessages(false); UpdateHeaderDate(false); }
private void OnViewChanged(object sender, ScrollViewerViewChangedEventArgs e) { if (Messages.ScrollingHost.ScrollableHeight - Messages.ScrollingHost.VerticalOffset < 120 && ViewModel.IsFirstSliceLoaded != false) { //Arrow.Visibility = Visibility.Collapsed; VisualUtilities.SetIsVisible(Arrow, false); } else { //Arrow.Visibility = Visibility.Visible; VisualUtilities.SetIsVisible(Arrow, true); } ViewVisibleMessages(e.IsIntermediate); UpdateHeaderDate(e.IsIntermediate); }
private void UpdateHeaderDate(bool intermediate) { var panel = Messages.ItemsPanelRoot as ItemsStackPanel; if (panel == null || panel.FirstVisibleIndex < 0) { return; } var minItem = true; var minDate = true; for (int i = panel.FirstVisibleIndex; i <= panel.LastVisibleIndex; i++) { var container = Messages.ContainerFromIndex(i) as SelectorItem; if (container == null) { continue; } var message = Messages.ItemFromContainer(container) as MessageViewModel; if (message == null) { continue; } if (minItem) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); if (point.Y + container.ActualHeight >= 0) { minItem = false; if (message.SchedulingState is MessageSchedulingStateSendAtDate sendAtDate) { DateHeaderLabel.Text = string.Format(Strings.Resources.MessageScheduledOn, DateTimeToFormatConverter.ConvertDayGrouping(Utils.UnixTimestampToDateTime(sendAtDate.SendDate))); } else if (message.SchedulingState is MessageSchedulingStateSendWhenOnline) { DateHeaderLabel.Text = Strings.Resources.MessageScheduledUntilOnline; } else { DateHeaderLabel.Text = DateTimeToFormatConverter.ConvertDayGrouping(Utils.UnixTimestampToDateTime(message.Date)); } } } if (message.Content is MessageHeaderDate && minDate) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); var height = (float)DateHeader.ActualHeight; var offset = (float)point.Y + height; minDate = false; if (offset >= 0 && offset < height) { container.Opacity = 0; } else { container.Opacity = 1; } if (offset >= height && offset < height * 2) { _dateHeader.Offset = new Vector3(0, -height * 2 + offset, 0); } else { _dateHeader.Offset = new Vector3(); } } else { container.Opacity = 1; } } _dateHeaderTimer.Stop(); _dateHeaderTimer.Start(); VisualUtilities.SetIsVisible(DateHeaderPanel, true); }
private void UpdateHeaderDate(bool intermediate) { var panel = Messages.ItemsPanelRoot as ItemsStackPanel; if (panel == null || panel.FirstVisibleIndex < 0) { return; } var top = 0d; var bottom = 0d; var knockout = SettingsService.Current.Diagnostics.BubbleKnockout; var start = knockout ? panel.FirstCacheIndex : panel.FirstVisibleIndex; var end = knockout ? panel.LastCacheIndex : panel.LastVisibleIndex; var minKnock = knockout; var minItem = true; var minDate = true; for (int i = start; i <= end; i++) { var container = Messages.ContainerFromIndex(i) as SelectorItem; if (container == null) { continue; } var message = Messages.ItemFromContainer(container) as MessageViewModel; if (message == null) { continue; } if (minKnock) { var negative = Messages.TransformToVisual(container); var relative = negative.TransformPoint(new Point()); top = relative.Y; bottom = relative.Y + Messages.ActualHeight; minKnock = false; } if (minItem && i >= panel.FirstVisibleIndex) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); if (point.Y + container.ActualHeight >= 0) { minItem = false; if (message.SchedulingState is MessageSchedulingStateSendAtDate sendAtDate) { DateHeaderLabel.Text = string.Format(Strings.Resources.MessageScheduledOn, DateTimeToFormatConverter.ConvertDayGrouping(Utils.UnixTimestampToDateTime(sendAtDate.SendDate))); } else if (message.SchedulingState is MessageSchedulingStateSendWhenOnline) { DateHeaderLabel.Text = Strings.Resources.MessageScheduledUntilOnline; } else { DateHeaderLabel.Text = DateTimeToFormatConverter.ConvertDayGrouping(Utils.UnixTimestampToDateTime(message.Date)); } } } if (message.Content is MessageHeaderDate && minDate && i >= panel.FirstVisibleIndex) { var transform = container.TransformToVisual(DateHeaderRelative); var point = transform.TransformPoint(new Point()); var height = (float)DateHeader.ActualHeight; var offset = (float)point.Y + height; minDate = false; if (offset >= 0 && offset < height) { container.Opacity = 0; } else { container.Opacity = 1; } if (offset >= height && offset < height * 2) { _dateHeader.Offset = new Vector3(0, -height * 2 + offset, 0); } else { _dateHeader.Offset = new Vector3(); } } else { container.Opacity = 1; } if (knockout && container.ContentTemplateRoot is MessageBubble bubble) { bubble.UpdateKnockout(top / container.ActualHeight, bottom / container.ActualHeight); } top -= container.ActualHeight; bottom -= container.ActualHeight; } _dateHeaderTimer.Stop(); _dateHeaderTimer.Start(); VisualUtilities.SetIsVisible(DateHeaderPanel, true); }