C# XAML DataTemplate für EPG

Mike Lowrey

Commodore
Registriert
Juni 2005
Beiträge
4.978
Hi,


ich versuche aktuell ein DataTemplate zu erstellen um ein EPG in einer WPF Anwendung zu erstellen.

Die Daten kommen von einem WCF service von dem werden erst Kanallisten abgerufen und auf Basis der einzelnen Kanälen kann ich dann die jeweiligen Programmdaten abrufen.

Aus diesen Daten wollte ich dann eine List mit Items vom Typ EPG Item (siehe unten) erstellen.

Jedes WebProgramBasic beinhaltet dann DateTime Objekte für Start und Endzeit.

Erst hatte ich überlegt einfach eine ListBox für die EPG Daten zu benutzen, nur dann kann ich die Größe der Items schlecht in Abhängigkeit der länge des aktuellen Programms anpassen.
Code:
    public class EpgItem
    {

        public WebChannelBasic Phannel { get; private set; }
        public List<WebProgramBasic> Program { get; private set; }
    
    }


Habt ihr nen Tipp wie so ein Template aussehen muss, um ein EPG anzuzeigen
 
Mir fällt dazu jetzt auch kein standard Control ein was dazu geeignet wäre...

Ich glaube da musst du dir leider selbst eines bauen...
Oder du malst die kästchen mit Gdi+ einfach "von hand" xD
ist zwar ein bisschen schreibarbeit - müsste aber funktionieren
 
Im Grunde könnte man das ja relativ gut mit einem StackPanel anordnen, aber ich weiß nicht, wie man die Items der Liste da rein packen und vor allem wie man dann die Größe berechnen muss :/

Edit:
So bin zumindest etwas weiter gekommen, die die Liste wird schon mal korrekt an ein StackPanel gebunden.

Code:
    <Page.Resources>
        <DataTemplate x:Key="UserDataTemplate">
            <StackPanel Orientation="Horizontal">                
                <Label HorizontalAlignment="Left" Content="{Binding Path=Title}" Width="50" />
            </StackPanel>
        </DataTemplate>
    </Page.Resources>
    <Grid>
        <ListBox x:Name="lbChannels">
            <ListBox.ItemTemplate>
                <DataTemplate>                    
                    <StackPanel Orientation="Horizontal">                        
                        <Label Content="{Binding Name}" Width="120"/>
                        <ItemsControl x:Name="UserList" ItemTemplate="{StaticResource UserDataTemplate}" ItemsSource="{Binding Programs}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>            
        </ListBox>
        
    </Grid>

Problem ist allerdings das die Items im zweiten Stackpanel trotz Orientation="Horizontal" immer noch untereinander angezeigt werden.

Edit2:
Hm.... wenn man natürlich ItemTemplate und ListPanelTemplate durcheinader würfelt kann das natürlich nicht funktionieren...

So geht's jetzt schon mal grundsätzlich.
Code:
 <ListBox x:Name="lbChannels">          
            <ListBox.ItemTemplate>                
                <DataTemplate>   
                    <StackPanel Orientation="Horizontal">
                        <Label Content="{Binding Name}" Width="100"/>
                        <ListBox   ItemsSource="{Binding Programs}">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal"/>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                        <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <Border BorderThickness="1">
                                        <Label  Content="{Binding Path=Title}"  />
                                    </Border>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Jetzt fehlt nur noch die Berechnung der Breite der Elemente basierend auf Start und Endzeit.

Wenn ich das richtig sehe müsste man die Länge der Sendung errechnen, dann den Anteil an der anzuzeigenden Länge berechnen(also den Zeitrahmen) und diesen Anteil auf die Länge des Platzes übertragen.
 
Zuletzt bearbeitet:
Hm hat jemand vielleicht nen Tipp wie ich die Breite der Page in einem xaml MultiBinding(für einen entsprechenden Converter) mit übergeben kann?
 
Zurück
Oben