Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Prüfen ob ScrollBar notwendig bzw. alle Items sichtbar?
MillionsterNutzer
myCSharp.de - Member



Dabei seit:
Beiträge: 235

Themenstarter:

Prüfen ob ScrollBar notwendig bzw. alle Items sichtbar?

beantworten | zitieren | melden

Hallo!

In meiner Anwendung ist das Navigationsmenü dynamisch, so das der User evtl. wenig oder viele Bereiche in der Anwendung hat die er ansehen darf. Wenn er nun zusätzlich das Window recht klein hält kann es dazu kommen das nicht mehr alle Menüpunkte angezeigt werden. Aktuell sind die Menüpunke in einer horizontalen ListView gesammelt. Eigentlich gibt es schon ein zusätzliches kleines PopUp-Menü mit welchem der User immer alle Menüeinträge erreichen kann.
Dennoch wurde nun gefordert das es eine Möglichkeit geben soll das eigentliche Menü zu scrollen. Allerdings soll es kein Einfacher horizontaler Scrollbalken sein - da der ja bei einem Menü nicht all zu toll aussieht.

Tatsächlich habe ich nun zwei kleine fesche Buttons die genau das tun was geforer wurdet, allerdings sind diese aktuell immer sichtbar - auch wenn evtl. gar nicht gescrollt werden müsste.

Wie kann ich von meiner ListView erfahren ob nun gerade genug Platz da ist um alle Elemente komplett anzuzeigen oder nicht?
Ich hab inzwischen schon zwei Stunden rumprobiert und bekomms trotzdem einfach nicht hin.

Kann mir jemand kurz einen Tip geben?

Viele Grüße

Ralf
private Nachricht | Beiträge des Benutzers
ThomasE.
myCSharp.de - Member



Dabei seit:
Beiträge: 454

beantworten | zitieren | melden

Hallo,

mir stellt sich zuerst die Frage, wurde nun ein ScrollViewer verwendet und dessen Style/Template verändert oder eine Eigenproduktion?
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen...
private Nachricht | Beiträge des Benutzers
MillionsterNutzer
myCSharp.de - Member



Dabei seit:
Beiträge: 235

Themenstarter:

beantworten | zitieren | melden

Hi ThomasE,

es handlet sich um eine Eigenproduktion :-)

VG

Ralf
private Nachricht | Beiträge des Benutzers
ThomasE.
myCSharp.de - Member



Dabei seit:
Beiträge: 454

beantworten | zitieren | melden

Na dann wäre ein wenig Code nicht schlecht, damit man sich daraus ein Bild machen kann, bzw. ein Bild selbst, wie die Scrollbar aussehen sollte..

Die Alternative wäre natürlich die andere Sache was ich schrieb...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ThomasE. am .
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen...
private Nachricht | Beiträge des Benutzers
MillionsterNutzer
myCSharp.de - Member



Dabei seit:
Beiträge: 235

Themenstarter:

beantworten | zitieren | melden

Hallo ThomasE,

sorry wegen der späten Antwort, war die letzten Tage ausser Gefecht...

damit du dir besser vorstellen kannst was ich da treibe habe ich einen Screenshot von dem Menü gemacht um welches es mir geht. Da sieht man auch auf der rechten Seite zwei Buttons mit denen man scrollen kann.

Der Code der beiden Buttons ist denkbar einfach. Ich ermittle den ScrollViewer meiner ListView und rufe dann deren PageLeft() oder PageRight() Methode auf:

        
        private void ScrollLeftButton_Click(object sender, RoutedEventArgs e)
        {
            ScrollViewer myScrollviewer = FindVisualChild<ScrollViewer>(this.ComponentGroupListView);
            if (myScrollviewer != null)
            {
                myScrollviewer.PageLeft();
            }
        }

Hier noch das XAML des ListView:

                <ListView x:Name="ComponentGroupListView"
                          Grid.Column="0"
                          Margin="0"
                          VerticalContentAlignment="Center"
                          Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"
                          BorderThickness="0"
                          DisplayMemberPath="DisplayName"
                          ItemsSource="{Binding AvailableComponentGroups}"
                          ScrollViewer.HorizontalScrollBarVisibility="Disabled"   
                          ScrollViewer.VerticalScrollBarVisibility="Disabled"
                          SelectedValue="{Binding Path=SelectedComponentGroup,
                                              Mode=TwoWay}"
                          SelectionMode="Single"
                          SizeChanged="ComponentGroupListView_SizeChanged">
                    <ListView.ItemContainerStyle>
                        <Style BasedOn="{StaticResource ComponentGroupListItemStyle}"
                               TargetType="ListViewItem">
                            <Setter Property="VerticalAlignment"
                                    Value="Center" />
                            <Setter Property="VerticalContentAlignment"
                                    Value="Center" />
                        </Style>
                    </ListView.ItemContainerStyle>
                    <ListView.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </ListView.ItemsPanel>
                </ListView>

Das Problem ist wie bereits erwähnt, dass die Buttons aktuell immer sichtbar sind, auch wenn die ListView genug Platz hat und es nichts zu scrollen gibt.
Daher wüsste ich gern wie ich im CodeBehind mitbekommen kann wann ich die Buttons einblenden oder aber ausblenden kann.

VG

Ralf
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MillionsterNutzer am .
Attachments
private Nachricht | Beiträge des Benutzers
MillionsterNutzer
myCSharp.de - Member



Dabei seit:
Beiträge: 235

Themenstarter:

beantworten | zitieren | melden

OK, also wenn ich das Problem auf die harte Tour löse, dann sieht das so aus:


        private void FindListViewItems(DependencyObject obj, List<ListViewItem> listViewItems)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);

                if (child != null && child is ListViewItem)
                {
                    listViewItems .Add (child as ListViewItem);
                }
                else
                {
                    FindListViewItems(child, listViewItems);
                }
            }
        }

        private void ComponentGroupListView_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            List<ListViewItem> listViewItems = new List<ListViewItem>();
            this.FindListViewItems(this.ComponentGroupListView, listViewItems);

            double requiredWidth = 0;
            foreach (ListViewItem i in listViewItems)
            {
                requiredWidth += i.ActualWidth + i.Margin.Left + i.Margin.Right;
            }

            if (requiredWidth > this.ComponentGroupListView .ActualWidth )
            {
                this.ScrollGrid.Visibility = System.Windows.Visibility.Visible;
            }
            else
            {
                this.ScrollGrid.Visibility = System.Windows.Visibility.Collapsed;
            }
        }

Das funktioniert scheinbar einwandfrei - ist allerdings alles andere als elegant. Falls jemand noch eine schönere Idee hat, dann bitte her damit. Ansonsten wirds so wohl schon gehen.

VG

Ralf
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MillionsterNutzer am .
private Nachricht | Beiträge des Benutzers