2017-02-14 59 views
0

我有一个DataGrid,每个列有几个绑定。一列用于图像。我已经发现,下面的方式适用于在wpf DataGrid中绑定图像。WPF:将相同的图像绑定到DataGrid中的多行(提高性能)

<DataGridTemplateColumn Header="" Width="SizeToCells" IsReadOnly="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Image Width="16" Height="16" Source="{Binding imagePathStatus, IsAsync=True}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
public class DataGridObject 
{ 
    public String imagePathStatus { get; set; } 

    ... 
} 

这是一个状态和有3种类型。相同的类型意味着相同的图片。提到UI的性能时,我遇到了很多问题。特别是当我的后台任务在设置一列的状态后调用UI时。但是,初始化GridView(除了UI之外没有任何其他线程)需要很长时间。取消激活图像列可解决问题。

我正在寻找几个小时,并尝试了很多东西。

我已经把图像转化为资源,并通过

this.imagePathIcon = "pack://application:,,,/Etlxxx;component/GraphicUserInterface/Images/image.jpg"; 

我宣布结合异步使用它们,所以至少在UI不会冻结。

在我看来,问题是每一行加载图像,即使他们使用相同的图片。可能是因为我只限于这条路。据我所知,没有办法直接绑定图像。

一切工作正常。但是我可以看到每个图像都是分开加载的。我很困惑。

图片真的很小(16x16),但仍然减慢了整个应用程序。

有没有办法将同一图像绑定到DataGrid中的多个行。理想情况下,应用程序必须一次加载图像,并在其所属的每一行中立即显示。

感谢您的帮助!

+1

“据我所知,没有的直接结合方式一个图像”。那是不正确的。声明“ImageSource”类型的属性,例如'public ImageSource StatusImage {get;组; }',然后分配一个BitmapImage,比如'StatusImage = new BitmapImage(new Uri(“pack:// application:,,,/Etlxxx; component/GraphicUserInterface/Images/image.jpg”))''。然后绑定Image控件的'Source'属性,如'' – Clemens

+0

解决了这个问题。非常感谢你。是否可以将您的评论标记为解决方案? – theawak3r

回答

0

你当然可以直接绑定到图像,而不是图像路径url。

只需声明类型为ImageSource的财产,

public class DataGridObject 
{ 
    public ImageSource StatusImage { get; set; } 
    ... 
} 

和绑定到它是这样的:

<Image Source="{Binding StatusImage}"/> 

现在可以分配一个BitmapImage(或一些其它的ImageSource派生对象),例如直接像这样:

item.StatusImage = new BitmapImage(new Uri(
    "pack://application:,,,/Etlxxx;component/GraphicUserInte‌​rface/Images/image.j‌​pg")); 

或从先前创建的BitmapSource:

item.StatusImage = somePreloadedBitmapImage; 

或以及从XAML资源:

item.StatusImage = (ImageSource)Resources["imageResourceKey"]; 
+0

非常感谢。知道,我甚至可以绑定一个图像开辟了全新的可能性。 – theawak3r

0

使用静态资源。

<Window.Resources> 
    <BitmapImage x:Key="MyImageSource" UriSource="./images/error.png" /> 
</Window.Resources> 
<Grid> 
    <DataGrid Name="dataGrid" > 
     <DataGrid.Columns> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Image Width="16" Height="16" Source="{StaticResource MyImageSource}"/> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

假设图像位于“images”目录中。

+0

感谢您的参与。我会试试这个。但是,状态在运行时会改变。有没有一种方法可以引用一行的静态资源?理想情况下通过绑定... – theawak3r

相关问题