Оборачивая изображения в ListBox с помощью WrapPanel и ScrollViewer, выбранные элементы исчезают! - PullRequest
2 голосов
/ 20 мая 2009

Я использую ListBox для горизонтального отображения 800 миниатюр, но только по 6 за раз (в зависимости от разрешения экрана), я хочу перемещаться по изображениям с помощью кнопок по обе стороны от списка.

В настоящее время у меня это работает, но когда я изменяю SelectedItem списка на следующий / предыдущий эскиз, ScrollViewer автоматически не сохраняет SelectedItem в поле зрения. SelectedItem после 6 миниатюр просто исчезнет.

Я могу переместить ScrollBar, чтобы увидеть SelectedItem, но это не достаточно хорошо, в финальной версии я даже не хочу ScrollBar, я просто хочу, чтобы пользователи могли удерживать нажатой левую или правую кнопки и блит через фотографии.

Кроме того, просто чтобы объяснить, почему я этого хочу, каждый раз, когда SelectedItem изменяется в ListBox, он меняет предварительный просмотр FullSize фотографии выше.

Есть ли в Silverlight 2 какой-либо способ убедиться, что SelectedItem в ScrollViewer (в ListBox) остается в видимой области?

Вот текущий XAML для ListBox:

    <ListBox x:Name="lbPhotos" 
         ItemsSource="{Binding Photos}" 
         SelectedItem="{Binding Path=SelectedPhoto, Mode=TwoWay}" 
         ItemContainerStyle="{StaticResource ReflectionListBoxItemStyle}">

    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <controls:WrapPanel Margin="0" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.Template>
        <ControlTemplate>
            <Grid>
                <ScrollViewer VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" 
                              BorderThickness="0" MaxHeight="170">
                    <ItemsPresenter />
                </ScrollViewer>
            </Grid>
        </ControlTemplate>
    </ListBox.Template>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <Image MaxHeight="85" Source="{Binding ThumbnailUrl, Converter={StaticResource UrlToBitmapImageConverter}}" />
        </DataTemplate>
    </ListBox.ItemTemplate>

  </ListBox>

Стиль контейнера элемента здесь:

<Style x:Key="ReflectionListBoxItemStyle" TargetType="ListBoxItem">
        <Setter Property="Padding" Value="3"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Top"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="TabNavigation" Value="Local"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Grid Background="{TemplateBinding Background}">
                        <vsm:VisualStateManager.VisualStateGroups>
                            <vsm:VisualStateGroup x:Name="CommonStates">
                                <vsm:VisualState x:Name="Normal"/>
                                <vsm:VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="MainContentBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                                            <SplineColorKeyFrame KeyTime="00:00:00" Value="{StaticResource PinkColor}"/>
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="ReflectionBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                                            <SplineColorKeyFrame KeyTime="00:00:00" Value="{StaticResource PinkColor}"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="Disabled">
                                </vsm:VisualState>
                            </vsm:VisualStateGroup>
                            <vsm:VisualStateGroup x:Name="SelectionStates">
                                <vsm:VisualState x:Name="Unselected"/>
                                <vsm:VisualState x:Name="Selected">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="MainContentBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                                            <SplineColorKeyFrame KeyTime="00:00:00" Value="{StaticResource PinkColor}"/>
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="ReflectionBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                                            <SplineColorKeyFrame KeyTime="00:00:00" Value="{StaticResource PinkColor}"/>
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                            </vsm:VisualStateGroup>
                            <vsm:VisualStateGroup x:Name="FocusStates">
                                <vsm:VisualState x:Name="Focused">
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="Unfocused"/>
                            </vsm:VisualStateGroup>
                        </vsm:VisualStateManager.VisualStateGroups>
                        <StackPanel Orientation="Vertical" Margin="0,0,4,0">
                        <!-- Image -->
                                <Border HorizontalAlignment="{TemplateBinding HorizontalAlignment}" BorderThickness="3,3,3,2" CornerRadius="1" x:Name="MainContentBorder" VerticalAlignment="{TemplateBinding VerticalAlignment}">
                                    <Border.BorderBrush>
                                        <SolidColorBrush Color="#00000000"/>
                                    </Border.BorderBrush>
                                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                                </Border>

                                <!-- Image reflection -->
                                <Border RenderTransformOrigin="0.5,0.5" BorderThickness="3,2,3,3" CornerRadius="1" VerticalAlignment="{TemplateBinding VerticalAlignment}" Margin="0,2,0,0" x:Name="ReflectionBorder" HorizontalAlignment="{TemplateBinding HorizontalAlignment}">
                                    <Border.BorderBrush>
                                        <SolidColorBrush Color="#00000000"/>
                                    </Border.BorderBrush>
                                    <Border.OpacityMask>
                                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                            <GradientStop Color="#66000000" Offset="1"/>
                                            <GradientStop Color="#00000000" Offset="0.348"/>
                                        </LinearGradientBrush>
                                    </Border.OpacityMask>
                                    <Border.RenderTransform>
                                        <TransformGroup>
                                            <ScaleTransform ScaleY="-1"/>
                                        </TransformGroup>
                                    </Border.RenderTransform>
                                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                            </Border>
                            </StackPanel>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Ответы [ 2 ]

1 голос
/ 20 мая 2009

Вы можете использовать метод ScrollIntoView, передавая выбранный элемент.

Документы MSDN

0 голосов
/ 16 июня 2009

В итоге я использовал ScrollViewer.ScrollToHorizontOffset, так как ScrollIntoView не работал

...