2013-08-20 142 views
0

我將500個奇怪刻痕的列表綁定到一個列表,每列列有一個狀態圖像。滾動列表的速度非常緩慢,在不同列表的標籤之間也是如此。有沒有辦法讓這個圖像綁定更高性能?

這些都是我最近在添加這些圖片時發生的變化引起的。

有沒有辦法加快速度?

我的位圖(非常小的16 * 16):

<BitmapImage x:Key="ActiveIcon" UriSource="/WPFClient;component/Images/active.png" /> 
<BitmapImage x:Key="IdleIcon" UriSource="/WPFClient;component/Images/idle.png" /> 
<BitmapImage x:Key="AwayIcon" UriSource="/WPFClient;component/Images/away.png" /> 
<BitmapImage x:Key="UnknownIcon" UriSource="/WPFClient;component/Images/unknown.png" /> 

我的列表:

<ListBox ItemsSource="{Binding Users}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <DockPanel> 
     <Image Source="{Binding Status, Converter={StaticResource UserStatusToIconConverter}}" Height="16" Width="16" Margin="0,0,5,0" /> 
     <TextBlock Text="{Binding Nick}" /> 
     </DockPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

我的轉換器:

public class UserStatusToIconConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     string userStatus = value.ToString(); 
     string iconName = "UnknownIcon"; 

     switch (userStatus) 
     { 
      case "Active": 
       iconName = "ActiveIcon"; 
       break; 
      case "Idle": 
       iconName = "IdleIcon"; 
       break; 
      case "Away": 
       iconName = "AwayIcon"; 
       break; 
     } 

     return iconName; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

注意:代碼也不能像目前的那樣工作,實際上沒有圖像顯示。不過,我認爲這是一個小地方的細節。

+0

發佈您的完整XAML。聽起來好像你讓ListBox失去了默認的虛擬化。你是否將任何模板應用於ListBox? –

+1

順便說一句,它不是一個小細節。你正在做一個錯誤的綁定,這會導致很多異常(你可以在輸出窗口中看到這些)。這是性能下降的另一個可能原因。 –

+0

@HighCore你是對的。我會修復它並更新帖子。 – sprocket12

回答

1

嘗試使用VirtualizationStackPanel會給一些改進

<ListBox VirtualizingStackPanel.IsVirtualizing="True" 
       VirtualizingStackPanel.VirtualizationMode="Recycling"> 

</ListBox> 

在框架4.5 VirtualizingPanel信息,並將設置VirtualizingPanel.ScrollUnit =「項目」將提供良好的性能改善

+0

面板的默認滾動單位已經是「Item」。 – sprocket12

+0

但是VirtualizingStackPanel.VirtualizationMode =「回收」是一個有用的提示。它在MSDN上表示「當ItemsControl包含多個項目時,創建和丟棄項目容器的過程可能會對性能產生負面影響。」 - 我的500計數「多少」有多少? – sprocket12

+0

@MuhammadA它將支持大量的項目。 500個項目不會造成任何性能問題 –

0

來解決是最簡單的方法將轉換器更改爲:

public class UserStatusToIconConverter : IValueConverter 
{ 
    private static readonly Uri ActiveIcon = new Uri("pack://application:,,,/WPFClient;component/Images/active.png"); 
    private static readonly Uri IdleIcon = new Uri("pack://application:,,,/WPFClient;component/Images/idle.png"); 
    private static readonly Uri AwayIcon = new Uri("pack://application:,,,/WPFClient;component/Images/away.png"); 
    private static readonly Uri UnknownIcon = new Uri("pack://application:,,,/WPFClient;component/Images/unknown.png"); 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var userStatus = value.ToString(); 
     switch (userStatus) 
     { 
      case "Active": 
       return ActiveIcon; 
      case "Idle": 
       return IdleIcon; 
      case "Away": 
       return AwayIcon; 
      default: 
       return UnknownIcon; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

減速是由不正確的綁定引起的。

相關問題