WPF:将同一图像绑定到DataGrid中的多行(提高性能)

时间:2017-02-14 11:48:56

标签: c# wpf image binding datagrid

我有一个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中的多行。理想情况下,应用程序必须加载一次图像并立即在其所属的每一行中显示它。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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”目录中。

答案 1 :(得分:0)

您当然可以直接绑定到图像,而不是图像路径网址。

只需声明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"];