diff --git a/MainWindow.xaml b/MainWindow.xaml index 7cae4fc..d40dc3a 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -287,10 +287,55 @@ Background="#0A0A0A"/> + + + + diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 01f000f..e51e1a5 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -682,9 +682,9 @@ public partial class MainWindow : Window private async Task ShowEpgOverlayAsync() { EpgOverlay.Visibility = Visibility.Visible; - TxtEpgOverlayStatus.Text = "Lade EPG-Daten…"; + EpgCanvas.Children.Clear(); + TxtEpgOverlayStatus.Text = "Lade EPG-Daten\u2026"; - // Datum/Zeit-Anzeige im Header aktualisieren TxtEpgDate.Text = DateTime.Now.ToString("d. MMM", System.Globalization.CultureInfo.GetCultureInfo("de-DE")); TxtEpgTime.Text = DateTime.Now.ToString("HH:mm"); @@ -698,7 +698,8 @@ public partial class MainWindow : Window } } - BuildEpgGrid(); + TxtEpgOverlayStatus.Text = "Baue Programm\u2026"; + await BuildEpgGridAsync(); } private void HideEpgOverlay() @@ -707,11 +708,10 @@ public partial class MainWindow : Window EpgCanvas.Children.Clear(); } - private void BuildEpgGrid() + private async Task BuildEpgGridAsync() { EpgCanvas.Children.Clear(); - // Sender: TV-only, HD vor SD, alphabetisch wie in der Senderliste var channels = _allChannels .Where(c => c.Kind != ChannelKind.Radio) .GroupBy(c => NormalizeName(c.Name), StringComparer.OrdinalIgnoreCase) @@ -719,7 +719,6 @@ public partial class MainWindow : Window .OrderBy(c => NormalizeName(c.Name), StringComparer.OrdinalIgnoreCase) .ToList(); - // Aktuelles Sendefenster: ab letzter ganzer Stunde _epgStartTime = DateTime.Now.Date.AddHours(DateTime.Now.Hour); var totalMinutes = EpgTotalHours * 60; var contentWidth = EpgChannelColWidth + totalMinutes * EpgPxPerMin; @@ -731,12 +730,16 @@ public partial class MainWindow : Window BuildEpgHeader(totalMinutes, contentWidth, contentHeight); BuildEpgNowLine(totalMinutes, contentHeight); + // Zeilen in Batches einf\u00fcgen damit UI-Thread nicht h\u00e4ngt (82 Sender w\u00e4ren >5s) + const int batchSize = 10; for (int i = 0; i < channels.Count; i++) + { BuildEpgRow(channels[i], i, contentWidth); + if (i % batchSize == batchSize - 1) + await Dispatcher.InvokeAsync(() => { }, System.Windows.Threading.DispatcherPriority.Background); + } - TxtEpgOverlayStatus.Text = $"{channels.Count} Sender · {EpgTotalHours} Stunden"; - - // Immer ganz nach links scrollen wenn Overlay geöffnet wird + TxtEpgOverlayStatus.Text = $"{channels.Count} Sender \u00b7 {EpgTotalHours} Stunden"; EpgScrollViewer.ScrollToHorizontalOffset(0); EpgScrollViewer.ScrollToVerticalOffset(0); }