我需要从数据库中检索图像的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并将它们映射到资源字典中。
答案 0 :(得分:0)
答案 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属性。如果你不能添加一个,你需要设计一个策略来识别它们,或者通过顺序或其他一些属性,比如工具提示。
找到图像后,您可以根据需要设置其属性。