2011-11-20 24 views
2

我一直试图将代码附加到LongListSelector的StretchingBottom事件上,但没有成功。这是XAML定义LongListSelector控件事务不触发

<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没有成功。

任何人都可以帮忙吗?

回答

2

我刚刚得到这个有很大帮助的工作从MSDN blogCodeplex

的例子有对的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> 

这使得视觉状态组进行压缩,这样你就可以检测,如果列表appeares压缩滚动到结尾。当列表滚动到底部时,您希望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事件。 但它有效:)