C # / WPF Извлечение изображений из базы данных и их отображение - PullRequest
1 голос
/ 01 марта 2010

Мне нужно извлечь 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 голосов
/ 01 марта 2010

--- 1-я попытка, игнорировать до "2-й попытки" --- Не помещайте элементы управления изображения в словарь ресурсов.

Если у вас есть фиксированное количество изображений, поместите их прямо в окно. E.g.:

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

Затем настройте класс со свойствами Image1 и Image2, отображающими изображения, поступающие из вашей БД, и установите инициализированный экземпляр этого класса в качестве DataContext вашего окна.

Более реалистично, у вас есть переменное количество изображений. XAML становится:

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

И установить DataContext для экземпляра ComponentsList.

В словаре ресурсов вы можете поместить шаблон элемента. --- конец 1-й попытки ---

2-я попытка: После обмена нашими комментариями возникает ситуация, когда в словаре ресурсов определен шаблон, который вы хотите изменить во время выполнения.

Необходимо дождаться, чтобы шаблон был применен к вашему элементу управления размещением изображений. Это похоже на класс Toolbox. Я не могу найти его в документах MSDN, поэтому он выглядит нестандартно, что хорошо, так как есть метод OnApplyTemplate, где вы получаете эту информацию. Если вы не можете изменить этот класс, вы можете вызвать ApplyTemplate (), чтобы убедиться, что шаблон на месте.

Теперь вы можете использовать VisualTreeHelper.GetChild для просмотра дочерних элементов управления в шаблоне, чтобы найти интересующие изображения. В примере шаблона изображения не имеют атрибута имени. Если вы не можете добавить ни одного, вам нужно разработать стратегию их распознавания, либо по порядку, либо по некоторым другим атрибутам, таким как подсказка.

Как только изображение найдено, вы можете установить его свойства по своему усмотрению.

0 голосов
/ 01 марта 2010

Почему бы не использовать ResourceManagers ?

Оформить заказ: Хороший пример для менеджеров ресурсов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...