EPG: async Grid-Build (kein UI-Hang), dunkle Scrollbars im Overlay

This commit is contained in:
administrator 2026-05-11 07:26:49 +02:00
parent 1ad2d35e58
commit 4bf42b96b5
2 changed files with 57 additions and 9 deletions

View file

@ -287,10 +287,55 @@
Background="#0A0A0A"/>
<!-- Scrollbares EPG-Grid (Canvas) -->
<!-- ScrollBar-Style explizit hier weil vlc:VideoView eine eigene HWND hat
und Window.Resources-Styles dort nicht greifen -->
<ScrollViewer x:Name="EpgScrollViewer"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
Background="#0A0A0A">
<ScrollViewer.Resources>
<Style TargetType="ScrollBar">
<Setter Property="Background" Value="#0E0E0E"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Width" Value="10"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ScrollBar">
<Grid Background="{TemplateBinding Background}">
<Track Name="PART_Track" IsDirectionReversed="true">
<Track.Thumb>
<Thumb>
<Thumb.Template>
<ControlTemplate TargetType="Thumb">
<Border x:Name="thumbBd" Background="#3A3A3A" CornerRadius="3" Margin="2"/>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="thumbBd" Property="Background" Value="#555"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Thumb.Template>
</Thumb>
</Track.Thumb>
<Track.IncreaseRepeatButton>
<RepeatButton Background="Transparent" BorderThickness="0" Command="ScrollBar.PageDownCommand" IsTabStop="False"/>
</Track.IncreaseRepeatButton>
<Track.DecreaseRepeatButton>
<RepeatButton Background="Transparent" BorderThickness="0" Command="ScrollBar.PageUpCommand" IsTabStop="False"/>
</Track.DecreaseRepeatButton>
</Track>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Orientation" Value="Horizontal">
<Setter Property="Width" Value="Auto"/>
<Setter Property="Height" Value="10"/>
</Trigger>
</Style.Triggers>
</Style>
</ScrollViewer.Resources>
<Canvas x:Name="EpgCanvas"/>
</ScrollViewer>
</DockPanel>

View file

@ -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);
}