Laden...

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

Erstellt von MillionsterNutzer vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.641 Views
M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 9 Jahren
Prüfen ob ScrollBar notwendig bzw. alle Items sichtbar?

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

T
461 Beiträge seit 2013
vor 9 Jahren

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... 😄

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 9 Jahren

Hi ThomasE,

es handlet sich um eine Eigenproduktion 😃

VG

Ralf

T
461 Beiträge seit 2013
vor 9 Jahren

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...

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... 😄

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 9 Jahren

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

M
MillionsterNutzer Themenstarter:in
235 Beiträge seit 2005
vor 9 Jahren

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