StackPanel внутри ScrollView физически не прокручивается правильно

Рассмотрим следующий XAML (пользовательский элемент управления):

<Grid x:Name="LayoutRoot" ScrollViewer.VerticalScrollBarVisibility="Disabled">
    <Grid HorizontalAlignment="Right" Width="335.312" ScrollViewer.VerticalScrollBarVisibility="Disabled">
        <ed:BlockArrow Fill="#FFF4F4F5" HorizontalAlignment="Left" Margin="0" Orientation="Left" Stroke="Black" Width="15" RenderTransformOrigin="5.6,-0.412" Height="12" VerticalAlignment="Center" MouseEnter="LeftArrow_MouseEnter" MouseLeave="LeftArrow_MouseLeave" MouseLeftButtonUp="LeftArrow_MouseLeftButtonUp"/>
        <ed:BlockArrow Fill="#FFF4F4F5" Stroke="Black" RenderTransformOrigin="5.6,-0.412" Height="12" VerticalAlignment="Center" MouseEnter="RightArrow_MouseEnter" MouseLeave="RightArrow_MouseLeave" HorizontalAlignment="Right" Width="15" MouseLeftButtonUp="RightArrow_MouseLeftButtonUp"/>
        <ScrollViewer x:Name="panelScrollViewer" Margin="15,0" VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden">
            <StackPanel x:Name="slidingStackPanel" Orientation="Horizontal" Height="125.882" Width="305.312" ScrollViewer.VerticalScrollBarVisibility="Disabled" CanHorizontallyScroll="True" ScrollViewer.CanContentScroll="False"/>
        </ScrollViewer>
    </Grid>
</Grid>

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

panelScrollViewer.ScrollToHorizontalOffset(100);

Scrollview и HorizonalOffset панели стека по-прежнему равны нулю! Кроме того, ScrollOwner панели стека имеет значение null. Любые идеи?


person Jason    schedule 24.08.2011    source источник


Ответы (1)


Поскольку вы не указываете ширину ScrollViewer, он принимает размер StackPanel. Поскольку содержимое ScrollViewer не больше его размера, оно не будет прокручиваться и всегда будет иметь горизонтальное смещение, равное 0. Попробуйте установить ширину ScrollViewer на что-то меньшее, чем его содержимое, и у вас должна быть работающая горизонтальная прокрутка.

Также удалите всю избыточность отключения вертикальных полос прокрутки, одного раза будет достаточно.

<Grid x:Name="LayoutRoot">
<Grid HorizontalAlignment="Right" Width="335.312">
    <ed:BlockArrow Fill="#FFF4F4F5" HorizontalAlignment="Left" Margin="0" 
         Orientation="Left" Stroke="Black" Width="15" RenderTransformOrigin="5.6,-0.412"
         Height="12" VerticalAlignment="Center" MouseEnter="LeftArrow_MouseEnter" 
         MouseLeave="LeftArrow_MouseLeave" MouseLeftButtonUp="LeftArrow_MouseLeftButtonUp"/>
    <ed:BlockArrow Fill="#FFF4F4F5" Stroke="Black" RenderTransformOrigin="5.6,-0.412" 
         Height="12" VerticalAlignment="Center" MouseEnter="RightArrow_MouseEnter" 
         MouseLeave="RightArrow_MouseLeave" HorizontalAlignment="Right" Width="15" 
         MouseLeftButtonUp="RightArrow_MouseLeftButtonUp"/>
    <ScrollViewer x:Name="panelScrollViewer" Margin="15,0" CanContentScroll="False" 
          VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Hidden"
          Width="250">
        <StackPanel x:Name="slidingStackPanel" Orientation="Horizontal" Height="125.882" Width="305.312"/>
    </ScrollViewer>
</Grid>

person evanb    schedule 24.08.2011