Laden...

ListBox mit Elementen in ListBox mit Elementen

Erstellt von Sec vor 9 Jahren Letzter Beitrag vor 9 Jahren 4.044 Views
S
Sec Themenstarter:in
3 Beiträge seit 2015
vor 9 Jahren
Hinweis von Coffeebean vor 9 Jahren

Projekt entfernt. [Hinweis] Wie poste ich richtig? Punkt 4.1

ListBox mit Elementen in ListBox mit Elementen

Hallo Jungs,

ich habe folgendes Problem

ich habe eine ListView mit Elementen in der sich innerhalb einer Listview mit weiteren Elementen befindet.... Ähnlich einer Tabelle..

Mein Testprojekt läuft sehr sehr langsam / benötigt zu lange zum Laden...
Egal was ich versuche es wird nicht schneller....Sind es zu viele Elemente und WPF bekommt das nicht hin? Kann doch nicht sein oder.

Habe das Projekt mit hochgeladen.(Testprojekt und sehr einfach gehalten, hoffe ich...)

Kann mir einer helfen, bin blutiger Anfänger und mein erster Post 😃

Gruß

<Grid>
        <ListBox x:Name="LB_complete" ScrollViewer.CanContentScroll="False" >
            <ListBox.Style>
                <Style TargetType="{x:Type ListBox}">
                    <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue" />
                </Style>
            </ListBox.Style>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Border Margin="1" BorderBrush="SteelBlue" BorderThickness="1">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="250"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>

                            <Border Grid.Column="0" Margin="1,0,1,0" BorderThickness="1">
                                <Border.Style>
                                    <Style TargetType="{x:Type Border}">
                                        <Setter Property="Background" Value="SteelBlue"/>
                                        <Style.Triggers>
                                            <DataTrigger Binding ="{Binding Path=IsHeader}" Value="true">
                                                <Setter Property="Background" Value="Orange"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Border.Style>
                                
                                <TextBlock Margin="10,6,10,6" Text="{Binding Name}" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="14" FontWeight="Normal" Foreground="White" ToolTip="RessourcenkarteZeile"/>

                            </Border>

                            <Border Grid.Column="1" Margin="1,0,1,0" BorderThickness="1" Background="SteelBlue">
                                <Border.Style>
                                    <Style TargetType="{x:Type Border}">
                                        <Setter Property="Visibility" Value="Visible"/>
                                        <Style.Triggers>
                                            <DataTrigger Binding ="{Binding Path=IsHeader}" Value="true">
                                                <Setter Property="Visibility" Value="Collapsed"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Border.Style>
                                <ListBox HorizontalAlignment="Center" VerticalAlignment="Center" ItemsSource="{Binding CounterList}" Background="SteelBlue" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">

                                    <ListBox.Style>
                                        <Style TargetType="{x:Type ListBox}">
                                            <Setter Property="KeyboardNavigation.TabNavigation" Value="Continue" />
                                        </Style>
                                    </ListBox.Style>
                                    
                                    <ListBox.ItemContainerStyle>
                                        <Style TargetType="ListBoxItem">
                                            <Style.Setters>
                                                <Setter Property="Focusable" Value="False"/>
                                            </Style.Setters>

                                            <Style.Triggers>
                                                <Trigger Property="IsKeyboardFocusWithin" Value="true">
                                                    <Setter Property="IsSelected" Value="true" />
                                                </Trigger>
                                            </Style.Triggers>
                                        </Style>
                                    </ListBox.ItemContainerStyle>
                                    <ListBox.ItemTemplate>
                                        <DataTemplate >
                                            <Grid HorizontalAlignment="Center">
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="22" />
                                                    <RowDefinition Height="22"/>
                                                </Grid.RowDefinitions>
                                                <TextBlock Width="30" Grid.Row="0"  HorizontalAlignment="Center" Text="{Binding Counter}" FontSize="10" FontWeight="Normal" Foreground="White" VerticalAlignment="Center">
                                                    <TextBlock.Style>
                                                        <Style TargetType="{x:Type TextBlock}">
                                                            <Style.Triggers>
                                                                <DataTrigger Binding ="{Binding Path=Value}" Value="0">
                                                                    <Setter Property="Background" Value="Gray"/>
                                                                </DataTrigger>
                                                            </Style.Triggers>
                                                        </Style>
                                                    </TextBlock.Style>
                                                </TextBlock>
                                                <TextBox   Width="30" Grid.Row="1"  HorizontalAlignment="Center" x:Name="Element" Text="{Binding Value}" GotKeyboardFocus="Test" VerticalAlignment="Center"/>  
                                            </Grid>
                                        </DataTemplate>
                                    </ListBox.ItemTemplate>

                                    <ListBox.ItemsPanel>
                                        <ItemsPanelTemplate>
                                            <VirtualizingStackPanel Orientation="Horizontal" HorizontalAlignment="Center"/>
                                        </ItemsPanelTemplate>
                                    </ListBox.ItemsPanel>
                                </ListBox>
                            </Border>
                        </Grid>
                    </Border>

                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

 public partial class MainWindow : Window
    {
        internal List<Row> ZeilenListe { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            buildList();
        }

        private void buildList()
        {
            ZeilenListe = new List<Row>();
            for (int i = 0; i < 40; i++)
            {
                string tmpzeileName = "ZeileName_" + i.ToString();

                List<CounterElement> sl = new List<CounterElement>();           
                if (i != 0)
                {
                    for (int j = 0; j < 100; j++)
                    {
                        CounterElement tmpelement = new CounterElement(j);
                        sl.Add(tmpelement);
                    }
                }

                Row tmpZeile = null;
                if(i == 0)
                    tmpZeile = new Row(tmpzeileName, true, sl);
                else
                    tmpZeile = new Row(tmpzeileName, false, sl);

                ZeilenListe.Add(tmpZeile);
            }

            LB_complete.ItemsSource = ZeilenListe;
        }

        private void Test(object sender, KeyboardFocusChangedEventArgs e)
        {
            (sender as TextBox).SelectAll();
        }

    }

    class CounterElement
    {
        public int Counter  { get; set; }
        public double Value     { get; set; }


        //  Konstruktor
        public CounterElement()
        {
            Counter = 0;
            Value = 0;
        }
        public CounterElement(int Counter)
        {
            this.Counter = Counter;
            Value = 0;
        }
    }

    class Row
    {
        public string Name                { get; set; }
        public List<CounterElement> CounterList     { get; set; }
        public bool IsHeader { get; set; }

        public Row(string Zeile, bool Header,  List<CounterElement> liste)
        {
            this.Name = Zeile;
            this.CounterList  = liste;
            IsHeader        = Header;
        }

    }

16.806 Beiträge seit 2008
vor 9 Jahren

Der erste Post befreit Dich nicht von den Forenregeln, die Du sicherlich gelesen, da akzeptiert hast.
[Hinweis] Wie poste ich richtig?
Trotzdem willkommen.

Mit Hilfe des [Artikel] Debugger: Wie verwende ich den von Visual Studio? kannst Du analysieren, welche Elemente denn besonders langsam sind, sodass Du die ganze Arbeit nicht auf die freiwilligen Helfer abwälzt.
Wenn Du mehr Informationen lieferst ist die Wahrscheinlichkeit auch größer, dass Du Hilfe bekommst.

S
Sec Themenstarter:in
3 Beiträge seit 2015
vor 9 Jahren

meines Wissen kann ich den XAML Code doch nicht debuggen?!

Der Code-Behind ist nicht das Problem, dieser läuft schnell genug.
Brauch keine Code-Lösung, möchte nur wissen warum es solange benötigt und wie ich es schneller bekomme...

danke, Gruß

16.806 Beiträge seit 2008
vor 9 Jahren

Microsoft bietet zahlreiche Tools fuer die Analyse von XAML Performance, zB XAML UI Responsiveness Tool, XAML Performance Explorer......

2.207 Beiträge seit 2011
vor 9 Jahren

Hallo Sec,

mal ganz abgesehen davon, dass du kein MVVM und sowas verwendest...

Du lädst 39 x 100 Eingabefelder. Das sind 3900 Eingabefelder. Auf einen Schlag. Jeder normale Mensch würde das Programm so "schnell" wieder zumachen, wie es aufgegangen ist.
Die werden auch noch im UI-Thread generiert.

Kannst du nicht anzeigen, was gerade gebraucht wird?

Gruss

Coffeebean

S
Sec Themenstarter:in
3 Beiträge seit 2015
vor 9 Jahren

Hi Coffeebean,

ja 3900 Eingabefelder sind viel, aber diese sind notwendig 😦

wäre eine Aufteilung möglich, hätte ich dies bereits versucht um das Programm zu beschleunigen...

Hast du eine Idee trotz der vielen Eingabefelder?

Danke & Gruß

5.657 Beiträge seit 2006
vor 9 Jahren

Hi Sec,

Hast du eine Idee trotz der vielen Eingabefelder?

Kommt doch ganz auf deine Anforderungen an, aber darüber hast du ja nichts geschrieben. Evtl. tut es ja ein einfacher DataGridView*.

Christian

* Korrigert, danke für den Hinweis, BeZi.

Weeks of programming can save you hours of planning

P
1.090 Beiträge seit 2011
vor 9 Jahren

Ich halte da ein DataGridView auch für Besser und denke auch das es Grundlegend die vielen Elemente sind die das Problem verursachen.

Hier mal ein Artikel der einiges zu Performance Problemen bei WPF abhandelt.
CodeProjekt:Solutions for WPF Performance Issue

Was mir direkt ins Auge gesprungen ist, ist die Prüfung auf i==0 8 (bzw. != ) in der Schleife. Setzt den Sonderfall vor die Schleife und lass die Schleife bei 1 Starten. Macht auch den Code besser Lesbar.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

B
153 Beiträge seit 2007
vor 9 Jahren

DataGridView in WPF ???