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"/>
|
Background="#0A0A0A"/>
|
||||||
|
|
||||||
<!-- Scrollbares EPG-Grid (Canvas) -->
|
<!-- 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"
|
<ScrollViewer x:Name="EpgScrollViewer"
|
||||||
HorizontalScrollBarVisibility="Auto"
|
HorizontalScrollBarVisibility="Auto"
|
||||||
VerticalScrollBarVisibility="Auto"
|
VerticalScrollBarVisibility="Auto"
|
||||||
Background="#0A0A0A">
|
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"/>
|
<Canvas x:Name="EpgCanvas"/>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
|
|
|
||||||
|
|
@ -682,9 +682,9 @@ public partial class MainWindow : Window
|
||||||
private async Task ShowEpgOverlayAsync()
|
private async Task ShowEpgOverlayAsync()
|
||||||
{
|
{
|
||||||
EpgOverlay.Visibility = Visibility.Visible;
|
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"));
|
TxtEpgDate.Text = DateTime.Now.ToString("d. MMM", System.Globalization.CultureInfo.GetCultureInfo("de-DE"));
|
||||||
TxtEpgTime.Text = DateTime.Now.ToString("HH:mm");
|
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()
|
private void HideEpgOverlay()
|
||||||
|
|
@ -707,11 +708,10 @@ public partial class MainWindow : Window
|
||||||
EpgCanvas.Children.Clear();
|
EpgCanvas.Children.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BuildEpgGrid()
|
private async Task BuildEpgGridAsync()
|
||||||
{
|
{
|
||||||
EpgCanvas.Children.Clear();
|
EpgCanvas.Children.Clear();
|
||||||
|
|
||||||
// Sender: TV-only, HD vor SD, alphabetisch wie in der Senderliste
|
|
||||||
var channels = _allChannels
|
var channels = _allChannels
|
||||||
.Where(c => c.Kind != ChannelKind.Radio)
|
.Where(c => c.Kind != ChannelKind.Radio)
|
||||||
.GroupBy(c => NormalizeName(c.Name), StringComparer.OrdinalIgnoreCase)
|
.GroupBy(c => NormalizeName(c.Name), StringComparer.OrdinalIgnoreCase)
|
||||||
|
|
@ -719,7 +719,6 @@ public partial class MainWindow : Window
|
||||||
.OrderBy(c => NormalizeName(c.Name), StringComparer.OrdinalIgnoreCase)
|
.OrderBy(c => NormalizeName(c.Name), StringComparer.OrdinalIgnoreCase)
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
// Aktuelles Sendefenster: ab letzter ganzer Stunde
|
|
||||||
_epgStartTime = DateTime.Now.Date.AddHours(DateTime.Now.Hour);
|
_epgStartTime = DateTime.Now.Date.AddHours(DateTime.Now.Hour);
|
||||||
var totalMinutes = EpgTotalHours * 60;
|
var totalMinutes = EpgTotalHours * 60;
|
||||||
var contentWidth = EpgChannelColWidth + totalMinutes * EpgPxPerMin;
|
var contentWidth = EpgChannelColWidth + totalMinutes * EpgPxPerMin;
|
||||||
|
|
@ -731,12 +730,16 @@ public partial class MainWindow : Window
|
||||||
BuildEpgHeader(totalMinutes, contentWidth, contentHeight);
|
BuildEpgHeader(totalMinutes, contentWidth, contentHeight);
|
||||||
BuildEpgNowLine(totalMinutes, 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++)
|
for (int i = 0; i < channels.Count; i++)
|
||||||
|
{
|
||||||
BuildEpgRow(channels[i], i, contentWidth);
|
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";
|
TxtEpgOverlayStatus.Text = $"{channels.Count} Sender \u00b7 {EpgTotalHours} Stunden";
|
||||||
|
|
||||||
// Immer ganz nach links scrollen wenn Overlay geöffnet wird
|
|
||||||
EpgScrollViewer.ScrollToHorizontalOffset(0);
|
EpgScrollViewer.ScrollToHorizontalOffset(0);
|
||||||
EpgScrollViewer.ScrollToVerticalOffset(0);
|
EpgScrollViewer.ScrollToVerticalOffset(0);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue