Hallo zusammen,
heute habe ich ein GUI-Problem, welches ich mir nicht so recht erklären kann:
<ItemsControl Grid.Row="1" ItemsSource="{Binding ...}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="{Binding ...}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate TargetType="ItemsControl">
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Image Grid.Row="0" ...>
<Image.ToolTip>
<ToolTip ... />
</Image.ToolTip>
</Image>
<TextBlock Grid.Row="1" ... />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Ich versuche, ein ItemsControl zu erstellen, welches mir ein paar Bilder mit einem Bezeichner darunter entweder horizontal oder vertikal (je nach Binding) auflistet. Das funktioniert soweit auch, aber ich möchte eine horizontale / vertikale Scrollbar haben, wenn die Items über den sichtbaren Platz hinaus gehen. Das gelingt mir aber nicht, die Scrollbars sind immer unsichtbar. Wenn ich im ScrollViewer statt Auto den Wert Visible angebe, sind die Scrollbars zwar da, allerdings ausgegraut (obwohl die Items aus dem sichtbaren Bereich rausragen). Für einen Tipp, was ich hier falsch mache, wäre ich sehr dankbar, da ich da gestern den halben Tag mit allen möglichen Versuchen drauf gehauen hab.
Ich hab auch schon versucht, den ScrollViewer um das ItemsControl herum zu packen (statt im ItemsControl.Template) aber das hat genau denselben Effekt.
Danke
Ich denke du musst bei der RowDefinition ein Height="" eingeben und gegebenenfalls noch eine ColumnDefinition mit Width="" hinzufügen.
Auto = nimm soviel Platz wie du brauchst => ragt auch über den sichtbaren Bereich hinaus und es wird kein Scrollbalken benötigt
* = nimm soviel Platz wie verfügbar ist => ragt nicht über den sichtbaren Bereich hinaus und es erscheint ein Scrollbalken
“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”
Hallo Urza,
habe es gerade mit * statt Auto getestet, macht aber leider keinen Unterschied.
Das ItemsControl selbst liegt auch in einem Grid und die Row / Column steht da auch bereits auf *
Versuche mal bitte Urzas Vorschlag plus den Scrollviewer um das gesamte ItemsControl zu legen.
Ggf müsste dieser vielleicht sogar noch weitere Ebenen im XAML nach oben.
Es gibt nur noch eine Ebene darüber, das Grid, in dem das ItemsControl liegt, ist das oberste Grid.
Ich habs jetzt mit * versucht und den ScrollViewer um das ItemsControl herum gelegt => kein Unterschied
Dann hab ich den ScrollViewer noch verschoben und um das äußere Grid gelegt => kein Unterschied
😦
Zwar spät, aber vielleicht doch interessant: Das Ganze hat eigentlich schon von Anfang an funktioniert. Wenn ich mein Control auf ein leeres Fenster packe, tut Alles wie es soll, aber im konkreten Anwendungsfall funktionierte es nicht. Nach Einiger Recherche kam raus, dass der "Benutzer" des Controls, das Control in ein Stackpanel geklatscht hat, wodurch es dann den beschriebenen Fehlereffekt gibt.
Wäre trotzdem interessant zu wissen, ob ich als Control-Entwickler irgendwas tun kann, um das zu verhindern. Das Control sollte ja überall gleich funktionieren, unabhängig davon, wo der Nutzer es in seinem Layout verwendet, oder?
Wäre trotzdem interessant zu wissen, ob ich als Control-Entwickler irgendwas tun kann, um das zu verhindern.
Nein.
Das StackPanel bietet dem Inhalt unbegrenzt viel Platz und der ScrollViewer füllt den Platz aus, den es hat.
Ergo: Der ScrollViewer kann unendlich groß werden, was die Scroll-Funktion überflüssig macht.
Besser wäre ein Grid oder ein DockPanel oder der ScrollViewer bekommt feste Maße.