2017-02-24 12 views
1

私はいくつかのアドバイスが必要です。私たちはScrollViewer内で異常な動作に気付きました。私はStackPanelをStackPanelがListBoxを含むより多くのアイテムにしています。リストパネルにデータをロードするときに、StackPanelはScrollViewerに配置され、一時的なプログラムがフリーズします。私が単独でListBoxですが、すべて正常に動作し、プログラムのフリーズはありません。ScrollViewer内のリストボックス - フリーズプログラム

private async Task AlbumsArtistInformation() 
    { 

     if (string.IsNullOrEmpty(ArtistName)) 
      return; 

     ObservableCollection<AlbumsArtistCollections> _albumsArtistCollections = 
      new ObservableCollection<AlbumsArtistCollections>(); 

     try 
     { 
      var search = await spotifyDataService.GetArtists(ArtistName); 
      if (search == null) throw new ArgumentNullException(nameof(search)); 



      foreach (var _artist in search.Artists.Items.Take(1)) 
      { 
       this.IdArtist = _artist.Id; 
      } 


      var _artistAlbum = await spotifyDataService.GetArtistsAlbumsAsync(this.IdArtist, AlbumType.All); 
      if (_artistAlbum == null) throw new ArgumentNullException(nameof(_artistAlbum)); 

      _albumsArtistCollections = _artistAlbum; 

     } 
     finally 
     { 

      // Unbind to improve UI performance 
      Application.Current.Dispatcher.Invoke(() => 
      { 
       this.Albums = null; 
       this.AlbumsCvs = null; 
      }); 




      Application.Current.Dispatcher.Invoke(() => 
      { 
       this.Albums = _albumsArtistCollections; 
      }); 




      Application.Current.Dispatcher.Invoke(() => 
      { 
       // Populate CollectionViewSource 
       this.AlbumsCvs = new CollectionViewSource { Source = this.Albums }; 

       //Group by Album if needed 
       this.AlbumsCvs.GroupDescriptions.Add(new PropertyGroupDescription("IdAlbum")); 
      }); 


     } 
    } 

は、誰もがこの問題を解決する方法を知っています:

<ScrollViewer VerticalScrollBarVisibility="Auto"> 
     <StackPanel x:Name="tStack" > 
      <Grid Height="300"> 

      </Grid> 
      <Grid Height="300"> 

      </Grid> 
      <ListBox x:Name="ListBox1" ItemsSource="{Binding AlbumsCvs.View, IsAsync=True}" 
          Style="{StaticResource ListBoxAlbumsTracksStyles}" 
          VirtualizingStackPanel.IsVirtualizing="True" 
          VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
          VirtualizingStackPanel.VirtualizationMode="Recycling" > 
       <ListBox.GroupStyle> 
        <GroupStyle ContainerStyle="{StaticResource AlbumsHeader}" /> 
       </ListBox.GroupStyle> 
      </ListBox> 
     </StackPanel> 
    </ScrollViewer> 



<Style x:Key="ListBoxAlbumsTracksStyles" TargetType="{x:Type ListBox}"> 
     <Setter Property="Padding" Value="0,0,0,0" /> 
     <Setter Property="Margin" Value="0,0,0,0" /> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Hidden" /> 
     <Setter Property="ItemTemplate"> 
      <Setter.Value> 

       <DataTemplate > 
        <DockPanel> 
         <Border Background="#00000000" 
          Height="36" 
          Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"> 

          <DockPanel> 
           <TextBlock x:Name="TrackNumber" 
             DockPanel.Dock="Left" Margin="2,0,5,0" 

             Text="{Binding TrackNumber}" 
             VerticalAlignment="Center" 
             FontSize="13" 
             MinWidth="17" 
             Foreground="Black"/> 
           <DockPanel> 
            <TextBlock DockPanel.Dock="Left"            
              Text="{Binding TrackTitle}" 
              TextAlignment="Left" 
              FontSize="13" 
              VerticalAlignment="Center" 
              HorizontalAlignment="Stretch" 
              TextTrimming="CharacterEllipsis" 
              Margin="0,0,2,0"/> 
            <TextBlock DockPanel.Dock="Right" 
              Text="{Binding Duration}" 
              VerticalAlignment="Center" 
              HorizontalAlignment="Stretch" 
              TextTrimming="CharacterEllipsis" 
              Margin="0,0,10,0" 
              FontSize="13" TextAlignment="Right"/>          
           </DockPanel> 
          </DockPanel> 
         </Border> 
        </DockPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 

    </Style> 

    <!-- GroupItem --> 
    <Style x:Key="AlbumsHeader" TargetType="{x:Type GroupItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Border Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}" Background="#00000000"> 
         <StackPanel Margin="0,0,0,15"> 
          <StackPanel> 
           <TextBlock Text="{Binding AlbumName}" 
           DataContext="{Binding Items}" 
           Margin="0,5,0,0" 
           HorizontalAlignment="Stretch" 
           FontSize="20" 
           FontWeight="Light" 
           TextTrimming="CharacterEllipsis" 
           Foreground="Black"/> 
           <TextBlock Text="{Binding IdAlbum}" 
           DataContext="{Binding Items}" 
           Margin="0,0,0,10" 
           HorizontalAlignment="Stretch" 
           TextTrimming="CharacterEllipsis" 
           Foreground="Black"/> 
          </StackPanel> 
          <ItemsPresenter HorizontalAlignment="Stretch"/> 
         </StackPanel> 

        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

コードの背後にある:

は、ここに私のコードです。

+0

StackPanelをディッチし、Gridを使用する方法を使用します。 StackPanelは、スクロールや仮想化などのパネル境界を呼び出すことはありません。 –

答えて

1

レイアウト中にMeasureOverride(Size availableSize)メソッドを呼び出すと、垂直方向のStackPanelはListBoxの無制限の空き領域を提供します。したがって、ListBox(デフォルトでは仮想化を使用しています)はアイテム全体を作成する必要があります。そのため、しばらくフリーズをプログラムする理由です。

そのため、代わりにDockPanelを使用します。

<DockPanel x:Name="tStack" LastChildFill="True" > 
    <Grid DockPanel.Dock="Top" Height="300"> 

    </Grid> 
    <Grid DockPanel.Dock="Top" Height="300"> 

    </Grid> 
    <ListBox DockPanel.Dock="Bottom" x:Name="ListBox1" ItemsSource="{Binding AlbumsCvs.View, IsAsync=True}" 
         Style="{StaticResource ListBoxAlbumsTracksStyles}" 
         VirtualizingStackPanel.IsVirtualizing="True" 
         VirtualizingPanel.IsVirtualizingWhenGrouping="True" 
         VirtualizingStackPanel.VirtualizationMode="Recycling" > 
     <ListBox.GroupStyle> 
      <GroupStyle ContainerStyle="{StaticResource AlbumsHeader}" /> 
     </ListBox.GroupStyle> 
    </ListBox> 
</DockPanel> 

LastChildFillはデフォルトでtrueです。スペースを埋めるためには、ListBoxを最後の要素にする必要があります。

別の選択肢として、あなたはListBoxHeightを設定することができますし、ScrollViewerDockPanelを置くか、別のオプションとしてスプリッターとGridを考慮することができます。

関連する問題