EPG: async Grid-Build (kein UI-Hang), dunkle Scrollbars im Overlay
This commit is contained in:
parent
1ad2d35e58
commit
4bf42b96b5
2 changed files with 57 additions and 9 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue