2015-06-21 95 views
0

我有一个ListView,它应该显示由“Name”,“Thumbnail”和“AnimationPosition”属性组成的大量项目。每个项目类型中的后台任务负责切换缩略图,以便为它们制作动画。来自ObservableCollection的ListView项目需要为实现做好准备

现在不言而喻,这是一个相当繁重的操作,应该限制在尽可能少的项目上,例如,以可见/实现虚拟化ListView的项目。现在我已经将ListView的DataContext设置为ObeservableCollection实例,并将其绑定到其类型的属性。以下是我的XAML代码。

<TabControl Grid.Row="0" Grid.Column="2"> 

    <TabControl.Resources> 

    <Style x:Key="MediaItemStyle" TargetType="{x:Type ListViewItem}"> 

     <Setter Property="Margin" Value="5,5,5,5"/> 
     <Setter Property="Padding" Value="0,0,0,0"/> 
     <Setter Property="HorizontalAlignment" Value="Left"/> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListViewItem}"> 
      <Grid HorizontalAlignment="Left" VerticalAlignment="Top" Height="Auto" > 
       <Border x:Name="border" BorderBrush="{x:Null}" BorderThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" CornerRadius="2.5"/> 
       <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <ContentPresenter/> 
       </StackPanel> 
      </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 

    </Style> 

    <Style TargetType="custom:MediaContainerListView"> 

     <Setter Property="ItemsSource" Value="{Binding}"/> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/> 
     <Setter Property="ItemContainerStyle" Value="{StaticResource MediaItemStyle}"/> 
     <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
      <WrapPanel/> 
      </ItemsPanelTemplate> 
     </Setter.Value> 
     </Setter> 
     <Setter Property="ItemTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
      <DockPanel Width="256"> 

       <Image DockPanel.Dock="Top" Height="144" StretchDirection="Both" 
        Stretch="Fill" Source="{Binding Thumbnail.Source,Mode=OneWay}"/> 

       <ProgressBar DockPanel.Dock="Top" Height="2" 
          Minimum="0" Maximum="{Binding Thumbnail.AnimationPosition.Length}" 
          Value="{Binding Thumbnail.AnimationPosition.Position}" 
          Visibility="{Binding Thumbnail.AnimationPosition.Visibility}"/> 

       <TextBlock DockPanel.Dock="Bottom" Height="40" 
         TextWrapping="Wrap" TextTrimming="CharacterEllipsis" 
         TextAlignment="Center" Text="{Binding Name}"/> 

      </DockPanel> 
      </DataTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 

    </TabControl.Resources> 

    <TabItem Header=""> 

    <custom:MediaContainerListView x:Name="MediaContainerView"></custom:MediaContainerListView> 

    </TabItem> 

</TabControl> 

基本上,我有两种方法开始/停止每个单独项目的动画。

 public async void StartAnimation() 
     { 
     if(Count > 1) 
     { 
      Task thumbnailAnimationTask = AnimationTask(AnimationCancellationToken.Token); 
      await thumbnailAnimationTask; 
     } 
     } 

     public void StopAnimation() 
     { 
     AnimationCancellationToken.Cancel(); 
     } 

我在这里有两个问题。

  1. ListView似乎意识到所有的项目,而不仅仅是那些可见或实现范围内的项目。我怀疑我的XAML以某种方式杀死了虚拟化,并尝试了许多没有成功的解决方案。请注意,我需要我的ListView可扩展到MainWindow的尺寸,而不是固定的高度和宽度。
  2. 我需要在项目即将实现时调用StartAnimation,并在它离开视图时调用StopAnimation。

即使我的ListView控件没有正确的虚拟化,如果我的ObservableCollections工作是如何正确的认识,它只是由虚拟化管理项目的UI表现,而不是项目本身即调用StartAnimation/StopAnimation从项目的构造函数/析构函数中得到的帮助没有多大帮助,因为无论如何它们在创建时都会被调用。

有没有一种简洁的方式来通知每个项目他们即将实现或离开ListView视图?

更新: 虚拟化工作不正常是相关WrapPanel有一次我切换到VirtualizingStackPanel它开始正常工作的问题。不幸的是,它与WrapPanel不完全相同,并且由于.NET框架不提供1 VirtualizingWrapPanel,我选择使用here中的一个。这并不完美,但它完成了这项工作。

+0

从GetHashCode调用StartAnimation。至于停止,我不知道。 – Paparazzi

+0

谢谢@Blam,它解决了一半的问题。让我们看看是否有其他人能够想出一个可以一路走下去的解决方案。 –

回答

0

我终于自己解决了这个问题。我知道它不必如此复杂,实际上并非如此。由于我已经创建了自己的名为MediaContainerListView的ListView继承类,因此我可以重写它的一些虚拟方法。其中两个证明是我想要的。

protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 

被称为之前的产品即将出现,并

protected override void ClearContainerForItemOverride(DependencyObject element, Object item) 

被称为之前的项目即将消失。所以我在第一个中称为StartAnimation,在第二个中称为StopAnimation,它完美无瑕!

0

你说这是1/2

查找到的GetHashCode
通话 我认为它会调用它的GetHashCode只是为了找到它
无意间我发现它被称为当产品虚拟化

有动画终止(不循环)

+0

嗯,问题是我需要动画才能继续播放,只要该项目在望。关于GetHashCode,你是对的,它只是在实现项目之前或之前调用(不是一次,而是几次)。这是一件看似简单的事情,无法想象为什么一个简单的解决方案不应该存在。 –

+0

我也发现我的问题与虚拟化无法正常工作是因为我使用的WrapPanel。到目前为止,看起来我唯一的机会是使用支持虚拟化的第三方或开源WrapPanel,或者实现我自己,在这种情况下,我可能也能解决第二个问题。 –

相关问题