C#/ WPF从数据库中检索图像并显示它们

时间:2010-03-01 11:35:18

标签: c# wpf database binding

我需要从数据库中检索图像的url,将其绑定到业务对象,将其转换为位图图像并将其映射到资源字典中。资源字典用作库,我无法更改它。

数据库由一个包含三列的表组成:id,name,url。它是SQL CE 3.5本地数据库。我希望能够一次显示所有图像。

我设法写的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
using System.Collections.ObjectModel;
using System.Windows.Media.Imaging;
using System.Windows;
using System.Windows.Media;



namespace Library.Components
{
    public class ComponentsList : ObservableCollection<Components>
    {
        public ComponentsList()
        {


            String connString = @"Provider=Microsoft.SQLSERVER.CE.OLEDB.3.5; Data Source=local_source";

            String query = @"SELECT id, name, url FROM GraphicComponents";

            // Fill the Set with the data
            using (SqlConnection conn = new SqlConnection(connString))
            {
                try
                {
                    SqlCommand cmd = conn.CreateCommand();
                    cmd.CommandText = query;

                    conn.Open();
                    SqlDataReader rdr = cmd.ExecuteReader();
                    while (rdr.Read())
                    {

                        this.Add(new Components(rdr));

                    }
                }
                finally
                {
                    if (conn.State != ConnectionState.Closed) conn.Close();
                }
            }
        }


    }
    public class Components
    {

  int _componentID;
  string _name;
  BitmapImage _url;


  public Components(IDataRecord record)
  {
      _componentID = (int)record["id"];
      _name = (string)record["name"];
      _url = (string)record["url"];

  //Code taken from a tutorial used to convert the url into BitmapImage
    CreatePhoto((byte[])record["url"]);
  }


  void CreatePhoto(byte[] photoSource)
  {

    _url = new System.Windows.Media.Imaging.BitmapImage();
    System.IO.MemoryStream strm = new System.IO.MemoryStream();


    int offset = 78;
    strm.Write(photoSource, offset, photoSource.Length - offset);

    // Read the image into the bitmap object
    _url.BeginInit();
    _url.StreamSource = strm;
    _url.EndInit();

  }
  public int ComponentID
  {
      get { return _componentID; }
  }

  public string Name
  {
      get { return _name; }

  }

  public BitmapImage Photo
  {
      get { return _url; }
  }

    }
}

在XAML的资源字典中,我有图像控件。图像的来源是硬编码的;但我需要从数据库中检索它。

提前感谢您的帮助。 代码很乱,我确信有一种更简单的方法可以从数据库中检索图像的URL并将它们映射到资源字典中。

2 个答案:

答案 0 :(得分:0)

为什么不使用ResourceManagers

结帐:Nice Example on Resource Managers

答案 1 :(得分:0)

---第一次尝试,忽略直到'第二次尝试'--- 不要将Image控件放在资源字典中。

如果您有固定数量的图像,请将它们直接放在窗口中。 E.g:

<Window>
   <StackPanel>
      <Image Source="{Binding Path=Image1}" />
      <Image Source="{Binding Path=Image2}" />
   </StackPanel>
</Window>

然后设置一个类,其属性Image1和Image2映射到来自数据库的图像,并将此类的初始化实例设置为Window的DataContext。

更现实地说,你有不同数量的图像。 XAML成为:

<Window>
  <ItemsControl ItemsSource="{Binding Path=Components}">
     <ItemsControl.ItemTemplate>
       <DataTemplate>
          <Image Source="{Binding Path=Photo}" />
       </DataTemplate>
     </ItemsControl.ItemTemplate>
  <ItemsControl>
</Window>

并将DataContext设置为ComponentsList的实例。

您可以在资源字典中放置的是项目模板。 ---第一次尝试结束---

第二次尝试: 在我们的评论交换之后,情况是你在资源字典中定义了一个你想在运行时修改的模板。

必须等待模板已应用于托管图像的控件。它似乎是一个Toolbox类。我在MSDN文档中找不到它,所以它看起来是自定义的,这很好,因为有OnApplyTemplate方法可以获取此信息。如果您无法修改此类,则可以调用ApplyTemplate()以确保模板已就绪。

现在,您可以使用VisualTreeHelper.GetChild查看模板中的子控件,以便查找感兴趣的图像。在示例模板中,图像没有name属性。如果你不能添加一个,你需要设计一个策略来识别它们,或者通过顺序或其他一些属性,比如工具提示。

找到图像后,您可以根据需要设置其属性。