0 votes

ScrollViewer dans une ListBox ne fonctionne pas. WPF

J'ai ce qui suit défini dans mon contrôle :

        <Setter Property="Background" Value="#FFBADDE9"/>
        <Setter Property="MinWidth" Value="5"/>
        <Setter Property="MinHeight" Value="5"/>
        <Setter Property="FontSize">
            <Setter.Value>
                <Binding Path="DayFontSize">
                    <Binding.RelativeSource>
                        <RelativeSource Mode="FindAncestor" AncestorType="{x:Type toolkit:Calendar}" />
                    </Binding.RelativeSource>
                </Binding>
            </Setter.Value>
        </Setter>
        <Setter Property="HorizontalContentAlignment" Value="Right"/>
        <Setter Property="VerticalContentAlignment" Value="Top"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="primitives:CalendarDayButton">
                    <Grid MouseDown="Grid_MouseDown">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="18" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>                         
                        <Rectangle x:Name="SelectedBackground" Grid.Row="1" RadiusX="1" RadiusY="1" Opacity="0" Fill="{TemplateBinding Background}"/>
                        <Rectangle x:Name="Background" Grid.Row="1" RadiusX="1" RadiusY="1" Opacity="0" Fill="{TemplateBinding Background}" />
                        <Rectangle x:Name="InactiveBackground" Grid.Row="1" RadiusX="1" RadiusY="1" Opacity="0" Fill="#FFA5BFE1"/>
                        <Border>
                            <Border.Background>
                                <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                    <GradientStop x:Name="StartGradient" Color="#FFD5E2F2" Offset="0"/>
                                    <GradientStop x:Name="EndGradient" Color="#FFB9C9DD" Offset="1"/>
                                </LinearGradientBrush>
                            </Border.Background>
                            <ContentPresenter x:Name="NormalText" Margin="5,1,5,1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                <TextElement.Foreground>
                                    <SolidColorBrush x:Name="selectedText" Color="#FF333333" />
                                </TextElement.Foreground>
                            </ContentPresenter>
                        </Border>
                        <Rectangle x:Name="Border" StrokeThickness="0.5" Grid.RowSpan="2" SnapsToDevicePixels="True">
                            <Rectangle.Stroke>
                                <SolidColorBrush x:Name="BorderBrush" Color="#FF5D8CC9"/>
                            </Rectangle.Stroke>
                        </Rectangle>
                        <Path x:Name="Blackout" Grid.Row="1" Opacity="0" Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" RenderTransformOrigin="0.5,0.5" Fill="#FF000000" Stretch="Fill" Data="M8.1772461,11.029181 L10.433105,11.029181 L11.700684,12.801641 L12.973633,11.029181 L15.191895,11.029181 L12.844727,13.999395 L15.21875,17.060919 L12.962891,17.060919 L11.673828,15.256231 L10.352539,17.060919 L8.1396484,17.060919 L10.519043,14.042364 z"/>
                        <Rectangle Width="0" x:Name="DayButtonFocusVisual" Grid.Row="1" Visibility="Collapsed" IsHitTestVisible="false" RadiusX="1" RadiusY="1" Stroke="#FF45D6FA"/>                            
                        <Button x:Name="ActivateDayViewOnDay" Grid.Row="0" Opacity="0.3" Height="15" Margin="1,1,1,1" PreviewMouseLeftButtonDown="DayView_Click" />                          
                        <ScrollViewer Grid.Row="1" >
                            <ScrollViewer.Content>                          
                            <local:TestListBox
                            x:Name="eventsLbx" 
                            Background="Transparent"
                            BorderBrush="Transparent"
                            >
                            <local:TestListBox.ItemsSource>
                                <MultiBinding Converter="{StaticResource calendarEventsConverter}">
                                    <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type local:EventCalendar}}" Path="CalendarEvents"/>
                                    <Binding RelativeSource="{RelativeSource Mode=Self}" Path="DataContext"/>
                                </MultiBinding>
                            </local:TestListBox.ItemsSource>
                            <local:TestListBox.ItemTemplate>
                                <DataTemplate>                              
                                        <TextBlock TextTrimming="CharacterEllipsis" HorizontalAlignment="Center" FontSize="12" Text="{Binding Text}" />                             
                                </DataTemplate>
                            </local:TestListBox.ItemTemplate>
                        </local:TestListBox>   
                           </ScrollViewer.Content>
                        </ScrollViewer>
                    </Grid>                            
                    <ControlTemplate.Triggers>
                        <Trigger SourceName="eventsLbx" Property="HasItems" Value="False">
                            <Setter TargetName="eventsLbx" Property="Visibility" Value="Hidden"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

Maintenant, s'il y a plus d'éléments que ceux qui sont visibles, alors le scrollviewer apparaît correctement mais l'utilisateur NE PEUT PAS faire glisser le bouton central du scrollviewer pour faire défiler.

L'utilisateur peut cliquer sur les flèches à l'extrémité du scrollviewer pour défiler, mais il ne peut pas cliquer sur la barre qui apparaît sur la barre de défilement et la faire glisser pour faire défiler réellement le contenu.

Je n'arrive pas à comprendre pourquoi cela se produit...

1voto

gehho Points 4523

Si vous souhaitez faire défiler les éléments de votre ListBox, vous n'avez pas besoin de l'envelopper dans un ScrollViewer. Le ListBox prend en charge nativement le défilement. Cela signifie que si votre ListBox est trop petit pour afficher tous ses éléments, il ajoutera automatiquement des ScrollBar sur le côté.

0voto

almulo Points 104

Votre ScrollViewer et ListBox sont à l'intérieur d'une grille (Grid), et vous avez du code derrière l'évènement MouseDown de cette grille (Grid).

Il se peut qu'une action dans cette méthode perturbe les mécanismes de la souris du ScrollViewer, perturbant ainsi la propagation des événements ou quelque chose dans ce genre.

Vérifiez votre code derrière, ou postez le ici pour que nous puissions vous aider :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X