2016-08-30 9 views
0

私は、WPFのusercontrolにほぼ10000個のアイテムを表示するためのユースケースを持っています。私はItemsControlを使用しており、各項目はボタンで表されます(項目は単純なクリック可能なテキストです)。私はusercontrolリソースのボタンのスタイルを定義しました。ボタンスタイルのパフォーマンスがヒット

私のリストに5000個以上のアイテムがあり、UIペイントが減速し始めてから10000個のアイテムが表示されるまでに3分以上かかることがあります。

スタイルをリソースからButton.Styleに移動すると、アイテムを表示するのに2.5分かかります。

私がスタイルを完全に削除した場合、私は目立つ遅延は見られません。ボタンスタイルを使用する唯一の理由は、ボタンと同じ背景(他の場合はグレー)をContentPresenterのボーダー

パフォーマンスヒットを起こさずにスタイルを効率的に使用する方法、またはContentPresenter Borderの背景をボタンと同じ色(何とか透明になる)でペイントする方法を教えてください。ここで

は、コードサンプルは次のとおりです。

<UserControl.Resources> 
    <Style x:Key="ButtonStyle" TargetType="{x:Type Button}" BasedOn="{x:Null}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Button}"> 
        <Border x:Name="Chrome" Background="{TemplateBinding Property=Background}"> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" 
              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> 
          <ContentPresenter.Resources> 
           <Style TargetType="{x:Type TextBlock}" BasedOn="{x:Null}"> 
            <Setter Property="FontSize" Value="{Binding FontSize, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"/> 
           </Style> 
          </ContentPresenter.Resources> 
         </ContentPresenter> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<Grid Name="Grid1" Margin="5,5,5,5"> 
    <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Margin="5,0,0,0"> 
     <Border Name="Border1" Margin="2,2,2,2" BorderBrush="Gray" BorderThickness="2"> 
       <ItemsControl Name="ItemsControl1" ItemsSource="{Binding LargeItems}" FocusVisualStyle="{x:Null}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <UniformGrid Columns="{Binding Columns}" Rows="{Binding Rows}"/> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 

        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <Border Name="Border1" Background="{Binding BorderBkg}" 
            BorderThickness="1" Padding="{Binding PaddingVal}"> 
           <Button Name="MyButton" Content="{Binding Label}"        
             Background="{Binding Background}"  
             Foreground="{Binding Foreground}" 
             BorderThickness="0" 
             BorderBrush="Transparent" 
             Margin="0" 
             Style="{StaticResource ButtonStyle}" 
             IsEnabled="{Binding IsButtonEnabled}" 
             Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}, Path=DataContext.ButtonAction}" 
             CommandParameter="{Binding}"> 
           </Button> 
          </Border> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
     </Border> 
    </ScrollViewer> 
</Grid> 

おかげで、

RDV

答えて

0

あなたのItemControlで実装はデータの仮想化が存在しないようです。仮想化は、ItemsControlに VirtualizingPanel.IsVirtualizing = "True" VirtualizingPanel.VirtualizationMode = "Recycling" を追加して実装し、パフォーマンスの違いを確認してください。

+0

入力していただきありがとうございます。残念ながら、10,000個のアイテムをまとめて表示する必要があります。そのため、VirtualizingPanelは私を助けません。私は試してみましたが、レンダリングは1〜10,000分で遅くなりました。 – RDV

関連する問題