2010-03-01 3 views
1

Мне нужно получить URL-адрес изображения из базы данных, привязать его к бизнес-объекту, преобразовать его в растровое изображение и перевести его в словарь ресурсов. Словарь ресурсов используется как библиотека, и я не могу его изменить.C#/WPF Получение изображений из базы данных и их отображение

База данных состоит из одной таблицы с тремя столбцами: 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-адреса изображений из базы данных и отобразить их в словарь ресурсов.

+0

Что вы подразумеваете под этим именем? –

+0

Кажется, я прокомментировал неправильный пост. У меня есть словарь ресурсов в XAML: <Изображение IsHitTestVisible = "False" Stretch = "Fill" ToolTip = "Ядерный" Источник = "Library/image2.png" /><Изображение IsHitTestVisible = "False" Stretch = " Fill "ToolTip =" Plus "Source =" Library/image1.png "/> Как вы можете видеть,« URL-адреса »жестко закодированы. Мне нужна привязка здесь. – EVA

ответ

0

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

заказ: Nice Example on Resource Managers

+0

У меня есть словарь ресурсов в XAML, который используется в другом месте. Это выглядит следующим образом: Как вы можете видеть, URL'ы, являются жёстко. Мне нужна привязка здесь. – EVA

0

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

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

<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.

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

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

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

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

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

+0

Возможно, я должен был предоставить более подробную информацию. Приложение используется для создания диаграмм из предоставленных элементов (из словаря ресурсов). Вы перетаскиваете их, затем соединяете их и т. Д. Изображения помещаются в словарь ресурсов, и я вряд ли могу это изменить. – EVA

+0

Если они находятся в словаре ресурсов, почему вы читаете их из БД? – Timores

+0

Требование к проекту - это самый близкий ответ, который я могу дать. Предполагается, что он будет загружен библиотекой. Если бы я писал это с нуля, это было бы не так. – EVA

Смежные вопросы