public void CleanRythmStorm() { while (DateTime.UtcNow < CleanRythmStormTime) { Thread.Sleep(200); } Dispatcher.Invoke(() => { double offset = 0; while (RythmStormPanel.Children.Count > 2) { FrameworkElement frameworkElement = (FrameworkElement)RythmStormPanel.Children[0]; offset += frameworkElement.ActualHeight; RythmStormPanel.Children.RemoveAt(0); } double verticalOffset = RythmStormScrollViewer.VerticalOffset - offset; if (verticalOffset < 0) { verticalOffset = 0; } RythmStormFluidMove.Duration = new Duration(TimeSpan.FromSeconds(0)); RythmStormScrollViewer.ScrollToVerticalOffset(verticalOffset); }); Thread.Sleep(1); Dispatcher.Invoke(() => { RythmStormFluidMove.Duration = new Duration(TimeSpan.FromSeconds(0.2)); }); Console.WriteLine("Rythm storm cleaned"); }
public void AppendRythmStorm(BiliLiveJsonParser.Danmaku item) { Dispatcher.Invoke(() => { RythmStormPanel.Children.Add(new Danmaku(item)); if (!RythmStormScrollViewer.IsMouseOver) { RythmStormScrollViewer.ScrollToBottom(); } CleanRythmStormTime = DateTime.UtcNow.AddSeconds(0.2); HideRythmStormTime = DateTime.UtcNow.AddSeconds(5); }); if (CleanRythmStormTask == null || CleanRythmStormTask.IsCompleted) { CleanRythmStormTask = Task.Factory.StartNew(CleanRythmStorm); } if (ShowRythmStormTask == null || ShowRythmStormTask.IsCompleted) { ShowRythmStormTask = Task.Factory.StartNew(ShowRythmStorm); } }