使用通过ObservableCollection数据对象的数据绑定在列表框中动态加载图像 [英] Load Images dynamically in Listbox using Data Binding through ObservableCollection data object

查看:61
本文介绍了使用通过ObservableCollection数据对象的数据绑定在列表框中动态加载图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


我创建了一个示例项目,动态地在列表框项目中加载图像。


我的动机是动态提供一个在列表框中加载图像缩略图的路径。


为了达到这个目的,我有一个ObservationalCollection claass"PhotoCollection"。 (chk:Data.cs文件),我存储所有元数据rgd每个图像文件(* .jpg) 存在于给定的路径位置。 (关注:获取SDK样本)


Data.cs文件:


 


 使用系统; 
使用 System.Collections.ObjectModel;
使用 System.IO;
使用 System.Windows.Media.Imaging;

命名空间 SDKSamples.ImageSample
{
/// < summary>
/// 这个类描述了一张照片 - 它的位置,图像和
/// 从图像中提取的元数据。
/// < / summary>
public class 图片
{
公共照片(字符串路径)
{
_path = path;
_source = new Uri(路径);
_image = BitmapFrame.Create(_source);
_metadata = new ExifMetadata(_source);
}

public 覆盖 字符串 ToString()
{
return _source.ToString();
}

private string _path;

private Uri _source;
public string 来源{ get { return _path; }

private BitmapFrame _image;
public BitmapFrame图片{ get { return _image; } set {_ image = value;

private ExifMetadata _metadata;
public ExifMetadata元数据{ get { return _metadata; }

}

/// < summary>
/// 此类表示目录中的照片集合。
/// < / summary>
public class PhotoCollection:ObservableCollection< Photo>
{
public PhotoCollection(){}

public PhotoCollection( string path): this new DirectoryInfo(path)){}

public PhotoCollection(DirectoryInfo目录)
{
_directory = directory ;
Update();
}

public string 路径
{
set
{
_directory = new DirectoryInfo(value);
Update();
}
get { return _directory.FullName; }
}

public DirectoryInfo目录
{
设置
{
_directory = value;
Update();
}
get { return _directory; }
}
private void 更新()
{
this .Clear();
尝试
{
foreach (FileInfo f Blue"> in _directory.GetFiles(" * .jpg-quot; ))
添加(照片(f.FullName));

}
catch (DirectoryNotFoundException)
{
System.Windows.MessageBox.Show("No Such Directory");
}
}

DirectoryInfo _directory;
}


public enum ColorRepresentation
{
sRGB,
Uncalibrated
}

public enum FlashMode
{
FlashFired,
FlashDidNotFire
}

public 枚举 ExposureMode
{
手动,
NormalProgram,
AperturePriority,
ShutterPriority,
LowSpeedMode,
HighSpeedMode,
PortraitMode,
LandscapeMode,
未知
}

public 枚举 WhiteBalanceMode
{
日光,
荧光灯,
钨灯,
闪光灯,
StandardLightA,
StandardLightB,
StandardLightC,
D55,
D65,
D75,
其他,
未知
}

public ExifMetadata
{
BitmapMetadata _metadata;

public ExifMetadata(Uri imageUri)
{
BitmapFrame frame = BitmapFrame.Create(imageUri,BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
_metadata =(BitmapMetadata)frame.Metadata;

}

private decimal ParseUnsignedRational(< span style ="color:Blue"> ulong exifValue)
{
return 十进制)(exifValue& 0xFFFFFFFFL)/(十进制)((exifValue& 0xFFFFFFFF00000000L)>> 32);
}

private decimal ParseSignedRational( exifValue)
{
返回 decimal )(exifValue& 0xFFFFFFFFL)/( decimal )((exifValue& 0x7FFFFFFF00000000L)>> 32);
}

private object QueryMetadata( string query)
{
if (_metadata.ContainsQuery(query))
return _metadata.GetQuery(query);
else
return null < /跨度>;
}

public uint ?宽度
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 40962}" );
if (val == null
{
return null ;
}
else
{
if (val .GetType()== typeof (UInt32))
{
return uint ?)val;
}
else
{
return 系统。 Convert.ToUInt32(VAL);
}
}
}
}

public UINT ?高度
{
得到
{
对象 val = QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 40963}" );
if (val == null
{
return null ;
}
else
{
if (val .GetType()== typeof (UInt32))
{
return uint ?)val;
}
else
{
return 系统。 Convert.ToUInt32(VAL);
}
}
}
}

public 小数? Horizo​​ntalResolution
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif:{uint = 282}" );
if (val!= null
{
return ParseUnsignedRational(( ulong )val);
}
else
{
return ;
}
}
}

public decimal ? VerticalResolution
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif:{uint = 283}" );
if (val!= null
{
return ParseUnsignedRational(( ulong )val);
}
else
{
return ;
}
}
}

public string EquipmentManufacturer
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif:{uint = 271}" );
return (val!= null ?( string )val:String.Empty);
}
}

public string CameraModel
{
get
{
object val = QueryMetadata (" / app1 / ifd / exif:{uint = 272}" );
return (val!= null ?( string )val:String.Empty);
}
}

public string CreationSoftware
{
get
{
object val = QueryMetadata (" / app1 / ifd / exif:{uint = 305}" );
return (val!= null ?( string )val:String.Empty);
}
}

public ColorRepresentation ColorRepresentation
{
获取
{
如果(( ushort )QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 40961}" )== 1)
返回 ColorRepresentation.sRGB;
else
return ColorRepresentation.Uncalibrated;
}
}

public decimal ? ExposureTime
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 33434}" );
if (val!= null
{
return ParseUnsignedRational(( ulong )val);
}
else
{
return ;
}
}
}

public decimal ? ExposureCompensation
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 37380}" );
if (val!= null
{
return ParseSignedRational(( long )val);
}
else
{
return ;
}
}
}

public decimal ? LensAperture
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 33437}" );
if (val!= null
{
return ParseUnsignedRational(( ulong )val);
}
else
{
return ;
}
}
}

public decimal ? FocalLength
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 37386}" );
if (val!= null
{
return ParseUnsignedRational(( ulong )val);
}
else
{
return ;
}
}
}

public ushort ? IsoSpeed
{
get
{
return ushort ?)QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 34855}" );
}
}

public FlashMode FlashMode
{
获取
{
如果(( ushort )QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 37385}" )%2 == 1)
返回 FlashMode.FlashFired;
else
return FlashMode.FlashDidNotFire;
}
}

public ExposureMode ExposureMode
{
得到
{
ushort ? mode =( ushort ?)QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 34850}" ; );

if (mode == null
{
返回 ExposureMode.Unknown;
}
else
{
switch (( int )模式)
{
case 1:返回 ExposureMode.Manual;
case 2: return ExposureMode.NormalProgram;
case 3: return ExposureMode.AperturePriority;
case 4: return ExposureMode.ShutterPriority;
case 5: return ExposureMode.LowSpeedMode;
case 6: return ExposureMode.HighSpeedMode;
case 7: return ExposureMode.PortraitMode;
case 8: return ExposureMode.LandscapeMode;
默认返回 ExposureMode.Unknown;
}
}
}
}

public WhiteBalanceMode WhiteBalanceMode
{
get
{
ushort ? mode =( ushort ?)QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 37384}" ; );

if (mode == null
{
return WhiteBalanceMode.Unknown;
}
else
{
switch (( int )模式)
{
case 1:返回 WhiteBalanceMode.Daylight;
case 2: return WhiteBalanceMode.Fluorescent;
case 3: return WhiteBalanceMode.Tungsten;
case 10: return WhiteBalanceMode.Flash;
case 17: return WhiteBalanceMode.StandardLightA;
case 18: return WhiteBalanceMode.StandardLightB;
case 19: return WhiteBalanceMode.StandardLightC;
case 20: return WhiteBalanceMode.D55;
case 21: return WhiteBalanceMode.D65;
case 22: return WhiteBalanceMode.D75;
case 255: return WhiteBalanceMode.Other;
默认 return WhiteBalanceMode.Unknown;
}
}
}
}

public DateTime? DateImageTaken
{
get
{
object val = QueryMetadata(" / app1 / ifd / exif / subifd:{uint = 36867}" );
if (val == null
{
return null ;
}
else
{
string date = ( string )val;
尝试
{
return DateTime(
int .Parse(date.Substring(0,4)), //年
int .Parse(date.Substring(5,2)), //月
int .Parse(date.Substring(8,2)), // day
int .Parse(date.Substring(11,2)), / /小时
int .Parse(date.Substring(14,2)), //分钟
int .Parse(date.Substring(17,2)) // second
);
}
catch (FormatException)
{
return null ;
}
catch (OverflowException)
{
return null ;
}
catch (ArgumentNullException)
{
return null ;
}
catch (NullReferenceException)
{
return null ;
}
}
}

}
}
}

解决方案

我相信你需要删除[0]。来自你的绑定。 每个ItemTemplate都将显示一个项目,该项目将是绑定到itemssource的任何集合所公开的类型,在您的情况下,它直接绑定到datacontext。编辑
Blend中的模板将图像的源放置为< Image Source =" {Binding Image.Thumbnail,Mode = Default} />例如。


 


BTW,您无法在Blend 3和VS2010中使用项目,项目格式不兼容。


I have created a sample project to Load images in a listbox item dynamically.

My motive is to dynamically provide a path to load image's thumbnails in list box.

To achieve this I've an ObservationalCollection claass "PhotoCollection" (chk: Data.cs file), where I am storing all metadata rgd each Image files (*.jpg)  present in a given path location. (Followed: win SDK sample)

Data.cs file:

 

using System;
using System.Collections.ObjectModel;
using System.IO;
using System.Windows.Media.Imaging;

namespace SDKSamples.ImageSample
{
 /// <summary>
 /// This class describes a single photo - its location, the image and 
 /// the metadata extracted from the image.
 /// </summary>
 public class Photo
 {
 public Photo(string path)
 {
  _path = path;
  _source = new Uri(path);
  _image = BitmapFrame.Create(_source);
  _metadata = new ExifMetadata(_source);
 }

 public override string ToString()
 {
  return _source.ToString();
 }

 private string _path;

 private Uri _source;
 public string Source { get { return _path; } }

 private BitmapFrame _image;
 public BitmapFrame Image { get { return _image; } set { _image = value; } }

 private ExifMetadata _metadata;
 public ExifMetadata Metadata { get { return _metadata; } }

 }

 /// <summary>
 /// This class represents a collection of photos in a directory.
 /// </summary>
 public class PhotoCollection : ObservableCollection<Photo>
 {
 public PhotoCollection() { }

 public PhotoCollection(string path) : this(new DirectoryInfo(path)) { }

 public PhotoCollection(DirectoryInfo directory)
 {
  _directory = directory;
  Update();
 }

 public string Path
 {
  set
  {
  _directory = new DirectoryInfo(value);
  Update();
  }
  get { return _directory.FullName; }
 }

 public DirectoryInfo Directory
 {
  set
  {
  _directory = value;
  Update();
  }
  get { return _directory; }
 }
 private void Update()
 {
  this.Clear();
  try
  {
  foreach (FileInfo f in _directory.GetFiles("*.jpg"))
   Add(new Photo(f.FullName));

  }
  catch (DirectoryNotFoundException)
  {
  System.Windows.MessageBox.Show("No Such Directory");
  }
 }

 DirectoryInfo _directory;
 }


 public enum ColorRepresentation
 {
 sRGB,
 Uncalibrated
 }

 public enum FlashMode
 {
 FlashFired,
 FlashDidNotFire
 }

 public enum ExposureMode
 {
 Manual,
 NormalProgram,
 AperturePriority,
 ShutterPriority,
 LowSpeedMode,
 HighSpeedMode,
 PortraitMode,
 LandscapeMode,
 Unknown
 }

 public enum WhiteBalanceMode
 {
 Daylight,
 Fluorescent,
 Tungsten,
 Flash,
 StandardLightA,
 StandardLightB,
 StandardLightC,
 D55,
 D65,
 D75,
 Other,
 Unknown
 }

 public class ExifMetadata
 {
 BitmapMetadata _metadata;

 public ExifMetadata(Uri imageUri)
 {
  BitmapFrame frame = BitmapFrame.Create(imageUri, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
  _metadata = (BitmapMetadata)frame.Metadata;

 }

 private decimal ParseUnsignedRational(ulong exifValue)
 {
  return (decimal)(exifValue & 0xFFFFFFFFL) / (decimal)((exifValue & 0xFFFFFFFF00000000L) >> 32);
 }

 private decimal ParseSignedRational(long exifValue)
 {
  return (decimal)(exifValue & 0xFFFFFFFFL) / (decimal)((exifValue & 0x7FFFFFFF00000000L) >> 32);
 }

 private object QueryMetadata(string query)
 {
  if (_metadata.ContainsQuery(query))
  return _metadata.GetQuery(query);
  else
  return null;
 }

 public uint? Width
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif/subifd:{uint=40962}");
  if (val == null)
  {
   return null;
  }
  else
  {
   if (val.GetType() == typeof(UInt32))
   {
   return (uint?)val;
   }
   else
   {
   return System.Convert.ToUInt32(val);
   }
  }
  }
 }

 public uint? Height
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif/subifd:{uint=40963}");
  if (val == null)
  {
   return null;
  }
  else
  {
   if (val.GetType() == typeof(UInt32))
   {
   return (uint?)val;
   }
   else
   {
   return System.Convert.ToUInt32(val);
   }
  }
  }
 }

 public decimal? HorizontalResolution
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif:{uint=282}");
  if (val != null)
  {
   return ParseUnsignedRational((ulong)val);
  }
  else
  {
   return null;
  }
  }
 }

 public decimal? VerticalResolution
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif:{uint=283}");
  if (val != null)
  {
   return ParseUnsignedRational((ulong)val);
  }
  else
  {
   return null;
  }
  }
 }

 public string EquipmentManufacturer
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif:{uint=271}");
  return (val != null ? (string)val : String.Empty);
  }
 }

 public string CameraModel
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif:{uint=272}");
  return (val != null ? (string)val : String.Empty);
  }
 }

 public string CreationSoftware
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif:{uint=305}");
  return (val != null ? (string)val : String.Empty);
  }
 }

 public ColorRepresentation ColorRepresentation
 {
  get
  {
  if ((ushort)QueryMetadata("/app1/ifd/exif/subifd:{uint=40961}") == 1)
   return ColorRepresentation.sRGB;
  else
   return ColorRepresentation.Uncalibrated;
  }
 }

 public decimal? ExposureTime
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif/subifd:{uint=33434}");
  if (val != null)
  {
   return ParseUnsignedRational((ulong)val);
  }
  else
  {
   return null;
  }
  }
 }

 public decimal? ExposureCompensation
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif/subifd:{uint=37380}");
  if (val != null)
  {
   return ParseSignedRational((long)val);
  }
  else
  {
   return null;
  }
  }
 }

 public decimal? LensAperture
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif/subifd:{uint=33437}");
  if (val != null)
  {
   return ParseUnsignedRational((ulong)val);
  }
  else
  {
   return null;
  }
  }
 }

 public decimal? FocalLength
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif/subifd:{uint=37386}");
  if (val != null)
  {
   return ParseUnsignedRational((ulong)val);
  }
  else
  {
   return null;
  }
  }
 }

 public ushort? IsoSpeed
 {
  get
  {
  return (ushort?)QueryMetadata("/app1/ifd/exif/subifd:{uint=34855}");
  }
 }

 public FlashMode FlashMode
 {
  get
  {
  if ((ushort)QueryMetadata("/app1/ifd/exif/subifd:{uint=37385}") % 2 == 1)
   return FlashMode.FlashFired;
  else
   return FlashMode.FlashDidNotFire;
  }
 }

 public ExposureMode ExposureMode
 {
  get
  {
  ushort? mode = (ushort?)QueryMetadata("/app1/ifd/exif/subifd:{uint=34850}");

  if (mode == null)
  {
   return ExposureMode.Unknown;
  }
  else
  {
   switch ((int)mode)
   {
   case 1: return ExposureMode.Manual;
   case 2: return ExposureMode.NormalProgram;
   case 3: return ExposureMode.AperturePriority;
   case 4: return ExposureMode.ShutterPriority;
   case 5: return ExposureMode.LowSpeedMode;
   case 6: return ExposureMode.HighSpeedMode;
   case 7: return ExposureMode.PortraitMode;
   case 8: return ExposureMode.LandscapeMode;
   default: return ExposureMode.Unknown;
   }
  }
  }
 }

 public WhiteBalanceMode WhiteBalanceMode
 {
  get
  {
  ushort? mode = (ushort?)QueryMetadata("/app1/ifd/exif/subifd:{uint=37384}");

  if (mode == null)
  {
   return WhiteBalanceMode.Unknown;
  }
  else
  {
   switch ((int)mode)
   {
   case 1: return WhiteBalanceMode.Daylight;
   case 2: return WhiteBalanceMode.Fluorescent;
   case 3: return WhiteBalanceMode.Tungsten;
   case 10: return WhiteBalanceMode.Flash;
   case 17: return WhiteBalanceMode.StandardLightA;
   case 18: return WhiteBalanceMode.StandardLightB;
   case 19: return WhiteBalanceMode.StandardLightC;
   case 20: return WhiteBalanceMode.D55;
   case 21: return WhiteBalanceMode.D65;
   case 22: return WhiteBalanceMode.D75;
   case 255: return WhiteBalanceMode.Other;
   default: return WhiteBalanceMode.Unknown;
   }
  }
  }
 }

 public DateTime? DateImageTaken
 {
  get
  {
  object val = QueryMetadata("/app1/ifd/exif/subifd:{uint=36867}");
  if (val == null)
  {
   return null;
  }
  else
  {
   string date = (string)val;
   try
   {
   return new DateTime(
    int.Parse(date.Substring(0, 4)), // year
    int.Parse(date.Substring(5, 2)), // month
    int.Parse(date.Substring(8, 2)), // day
    int.Parse(date.Substring(11, 2)), // hour
    int.Parse(date.Substring(14, 2)), // minute
    int.Parse(date.Substring(17, 2)) // second
   );
   }
   catch (FormatException)
   {
   return null;
   }
   catch (OverflowException)
   {
   return null;
   }
   catch (ArgumentNullException)
   {
   return null;
   }
   catch (NullReferenceException)
   {
   return null;
   }
  }
  }

 }
 }
}

解决方案

I believe you need to remove the [0]. from your bindings.  Each ItemTemplate will display a single item, which will be the type exposed by whatever collection is bound to the itemssource, which in your case is bound straight to the datacontext. Editing the template in Blend puts the Source of the image as <Image Source="{Binding Image.Thumbnail, Mode=Default} /> for example.

 

BTW, you can't work with a project in both Blend 3 and VS2010, the project formats are incompatible.


这篇关于使用通过ObservableCollection数据对象的数据绑定在列表框中动态加载图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆