LongListSelector управления событиями strectching не запускаются - PullRequest
2 голосов
/ 20 ноября 2011

Я пытался присоединить код к событию StretchingBottom LongListSelector, но безуспешно. Это определение в XAML

<toolkit:LongListSelector x:Name="NewList" 
     IsFlatList="True" 
     IsBouncy="True"
     Background="Transparent"
     ShowListFooter="False" 
     ShowListHeader="{Binding ProgressBar}" 
     Margin="0,0,12,0" 
     ListHeaderTemplate="{StaticResource progressbarListHeader}"
     ItemsSource="{Binding Items}" 
     ItemTemplate="{StaticResource Item}" 
     SelectionChanged="List_SelectionChanged"
     StretchingBottom="List_StretchingBottom"/>

Это метод List_SelectionChanged:

private void List_StretchingBottom(object sender, EventArgs e)
{
    var listbox = (LongListSelector)sender;

    var viewModel = (ItemsViewModel)listbox.DataContext;
    viewModel.LoadDataAfter();
}

Когда я ставлю точку останова на первой строке метода, она никогда не получает удар, даже если я растягиваюсь до конца или жду. Я пробовал StretchingTop и StretchingComplete безуспешно.

Кто-нибудь может помочь?

1 Ответ

2 голосов
/ 04 января 2012

Я только что получил это с большой помощью из блога MSDN и Codeplex

Примеры есть для ScrollViewer, но LongListSelector использует ScrollViewer ... 1-й: добавить шаблон в App.XAML внутри Application.Resources

<Style TargetType="ScrollViewer">
        <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
        <Setter Property="HorizontalScrollBarVisibility" Value="Auto"/>
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="Padding" Value="0"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ScrollViewer">
                    <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"
                            Background="{TemplateBinding Background}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="ScrollStates">
                                <VisualStateGroup.Transitions>
                                    <VisualTransition GeneratedDuration="00:00:00.5"/>
                                </VisualStateGroup.Transitions>
                                <VisualState x:Name="Scrolling">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetName="VerticalScrollBar"
                                            Storyboard.TargetProperty="Opacity" To="1" Duration="0"/>
                                        <DoubleAnimation Storyboard.TargetName="HorizontalScrollBar"
                                            Storyboard.TargetProperty="Opacity" To="1" Duration="0"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="NotScrolling">
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="VerticalCompression">
                                <VisualState x:Name="NoVerticalCompression"/>
                                <VisualState x:Name="CompressionTop"/>
                                <VisualState x:Name="CompressionBottom"/>
                                <VisualState x:Name="StretchingTop"/>
                                <VisualState x:Name="StretchingBottom"/>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="HorizontalCompression">
                                <VisualState x:Name="NoHorizontalCompression"/>
                                <VisualState x:Name="CompressionLeft"/>
                                <VisualState x:Name="CompressionRight"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Grid Margin="{TemplateBinding Padding}">
                            <ScrollContentPresenter x:Name="ScrollContentPresenter" Content="{TemplateBinding Content}"
                                ContentTemplate="{TemplateBinding ContentTemplate}"/>
                            <ScrollBar x:Name="VerticalScrollBar" IsHitTestVisible="False" Height="Auto" Width="5"
                                HorizontalAlignment="Right" VerticalAlignment="Stretch" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                                IsTabStop="False" Maximum="{TemplateBinding ScrollableHeight}" Minimum="0" Value="{TemplateBinding VerticalOffset}"
                                Orientation="Vertical" ViewportSize="{TemplateBinding ViewportHeight}" />
                            <ScrollBar x:Name="HorizontalScrollBar" IsHitTestVisible="False" Width="Auto" Height="5"
                                HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                IsTabStop="False" Maximum="{TemplateBinding ScrollableWidth}" Minimum="0" Value="{TemplateBinding HorizontalOffset}"
                                Orientation="Horizontal" ViewportSize="{TemplateBinding ViewportWidth}" />
                        </Grid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

Включает визуальные группы состояний для Сжатия, поэтому вы можете обнаружить Сжатие, которое появляется, если список прокручивается до конца. Вы хотите CompressionBottom, поскольку это происходит, когда список прокручивается вниз. Теперь я присоединяю обработчик к событию LongListSelector.Loaded и внутри присоединяю обработчик к ScrollViewer.State

private void LongListSelector_Loaded(object sender, RoutedEventArgs e)
        {
           //get TemplatedListBox inside LongListSelector
           FrameworkElement tlb = VisualTreeHelper.GetChild(EventsDisplayList, 0) as FrameworkElement;
            //get ScrollViewer inside TemplatedListBox
            FrameworkElement sv = VisualTreeHelper.GetChild(tlb, 0) as FrameworkElement;
            //MS says VisualGroups are inside first Child of ScrollViewer 
            FrameworkElement here = VisualTreeHelper.GetChild(sv, 0) as FrameworkElement; 
            var groups = VisualStateManager.GetVisualStateGroups(here);
            VisualStateGroup vc = null;
            foreach (VisualStateGroup g in groups)
            {
                if (g.Name == "VerticalCompression")
                {
                    vc = g;
                    break;
                }
            }
            vc.CurrentStateChanged +=new EventHandler<VisualStateChangedEventArgs>(LongListSelector_Compression); 
        }

private void LongListSelector_Compression(object sender, VisualStateChangedEventArgs e)
        {
            if (e.NewState.Name == "CompressionBottom")
            {
                //put your code for loading new items here              
            }
        }

Как видите, я вообще не использую событие LongListSelector.StretchingBottom. Но это работает:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...