Frage

Ich habe eine ListBox WPF auf ein Datenobjekt gebunden. Innerhalb der Listbox ist eine Reihe von Bildern mit Text. Es wird in einer horizontalen Art und Weise verlegt aus, und über die linke oder rechte Seite der Box mousing bewegt die Elemente oder rechts bzw. links.

Lassen Sie uns sagen, es gibt 20 Elemente in der Listbox. Ich versuche, herauszufinden, wie wenn ich Position 19 Artikel getroffen (0 basierend), dass ich kann Zyklus die Box und die Sammlung von vorne beginnen, so dass es 1 -19 geht und so weiter. Es wäre andersrum auch Zyklus müssen, so dass, wenn Sie auf Punkt 0 sind, und gescrollt links, würden Sie 19 erhalten.

Ich habe die KeyboardNavigation.DirectionalNavigation versucht = „Cycle“, aber das tut‘scheint, nichts zu tun für mich, und ich war der Strohhalm greifen, da dies nichts mit der Tastatur zu tun, es ist alles Maus basiert.

        <ListBox ItemsSource="{Binding Source={StaticResource WPFApparelCollection}}" Margin="24,-7,39,-19" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden" SelectionMode="Single" x:Name="list1" MouseLeave="List1_MouseLeave" MouseMove="List1_MouseMove" Style="{DynamicResource ListBoxStyle1}" Background="Transparent" BorderThickness="0">
            <ListBox.Resources>
                <!-- override the system brushes so that selected items are transparent whether the ListBox has focus or not -->
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
                <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
            </ListBox.Resources>
            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Setter Property="Background" Value="Transparent" />
                    <Setter Property="HorizontalContentAlignment" Value="{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
                    <Setter Property="VerticalContentAlignment" Value="{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
                    <Setter Property="Padding" Value="20,10,20,10" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <Border x:Name="Bd" SnapsToDevicePixels="true" Background="Transparent" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="true">
                                        <Setter Property="Background" TargetName="Bd" Value="Transparent" />
                                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" />
                                    </Trigger>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="IsSelected" Value="true" />
                                            <Condition Property="Selector.IsSelectionActive" Value="false" />
                                        </MultiTrigger.Conditions>
                                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
                                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
                                    </MultiTrigger>
                                    <Trigger Property="IsEnabled" Value="false">
                                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel Orientation="Horizontal" IsItemsHost="True" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <Image Source="{Binding Image}" MouseLeave="Image_MouseLeave" MouseEnter="Image_MouseEnter" Cursor="Hand" Tag="{Binding Link}" MouseLeftButtonDown="Image_MouseLeftButtonDown" VerticalAlignment="Top" HorizontalAlignment="Left"></Image>
                        <Label Content="{Binding Name}" Cursor="Hand" Tag="{Binding Link}" MouseLeftButtonDown="Label_MouseLeftButtonDown" VerticalAlignment="Bottom" Foreground="White" Style="{StaticResource Gotham-Medium}" FontSize="8pt" HorizontalAlignment="Center" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
War es hilfreich?

Lösung

Die Frage ist hier nicht wirklich mit dem ListBox , aber mit der Scroll innerhalb seiner Steuervorlage; deshalb, um den Artikel Zyklus machen Sie benötigen die Scroll in irgendeiner Weise zu ändern. Ich habe eine Kontrolle geschrieben, das von leitet Scroll , dass Zyklen in vertikaler Richtung ... aber es sollte einfach sein zu sehen, wie es horizontal machen zu arbeiten.

public class CyclicScrollViewer : ScrollViewer
{
    public CyclicScrollViewer()
    {
        this.CommandBindings.Add(new CommandBinding(ScrollBar.LineUpCommand, LineCommandExecuted));
        this.CommandBindings.Add(new CommandBinding(ScrollBar.LineDownCommand, LineCommandExecuted));
    }

    private void LineCommandExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        if (e.Command == ScrollBar.LineUpCommand)
        {
            if (this.VerticalOffset == 0)
                this.ScrollToEnd();
            else
                this.LineUp();
        }

        if (e.Command == ScrollBar.LineDownCommand)
        {
            if (this.VerticalOffset == this.ScrollableHeight)
                this.ScrollToTop();
            else
                this.LineDown();
        }
    }
}

Die scrollTo ... und Line ... Methoden existieren bereits auf dem Scroll machen die Codierung ziemlich einfach. Alles, was ich bin hier, um die aktuelle gegen die Grenzen des Betrachters Offset prüft dabei vor Scrollen.

Der nächste Schritt ist die neue Scroll in die Steuervorlage für die Zielsteuerung, in diesem Fall legen Sie die ListBox . Hier ist ein XAML-Schnipsel dies zu demonstrieren.

        <ControlTemplate x:Key="{x:Type ListBox}" TargetType="ListBox">
            ...
                <l:CyclicScrollViewer 
                    Padding="{TemplateBinding Control.Padding}" 
                    Focusable="False">
                    <ItemsPresenter ... />
                </l:CyclicScrollViewer>
            ...
        </ControlTemplate>

Ich habe eine Beispielanwendung geschrieben, die diesen Code verwendet hier . Diese Probe nicht Tastatur-Unterstützung haben, aber das kann einfach durch Überschreiben der OnKeyDown Methode und die Ausführung der entsprechenden Line ... Befehle hinzugefügt werden. Ich hoffe, das hilft.

Andere Tipps

Es gibt eine Reihe von freien und kommerziellen WPF Karussell-Implementierungen, die dies tun. Werfen Sie einen Blick auf dieses Roundup http://mdavey.wordpress.com/2007 / 04/03 / wpf-Karussell /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top