最近在做一个WPF的抽奖程序,需要显示人员照片。做的时候把照片全都加到项目里了,作为内容,在ListBox或其他控件中绑定,可以正常显示。但人员照片需要经常添加修改的,总不能每次都重新编译项目吧。因此看了一下WPF中资源文件的引用方式,详见 http://msdn.microsoft.com/zh-cn/library/aa970494.aspx

WPF 应用程序资源、内容和数据文件

根据MSDN的资料:

Microsoft Windows 应用程序通常依赖包含不可执行数据的文件,如Extensible Application Markup Language (XAML)、图像、视频和音频。 Windows Presentation Foundation (WPF) 为配置、识别和使用这些类型的数据文件(称为应用程序数据文件)提供了特殊支持。 这种支持主要针对一组特定的应用程序数据文件类型,包括:

  • 资源文件:编译到可执行或库 WPF 程序集中的数据文件。

  • 内容文件:与可执行 WPF 程序集具有显式关联的独立数据文件。

  • 源站点文件:与可执行 WPF 程序集没有关联的独立数据文件。

这三种类型的文件之间的一个重要区别是:资源文件和内容文件在生成时是已知的;程序集明确地知道它们的存在。 但是对于源站点文件,程序集可能完全不知道它们,或者通过 pack uniform resource identifier (URI) 引用知道它们的存在;在后一种情况下,不能保证被引用的源站点文件实际存在。

目前所需的就是第三种情况,照片并不需要关联到项目里,而是根据实际情况进行更新。因此绑定方式就需要做一下改动了。

简单说一下代码,首先是实体的Person类

public class Person    {public string Name { get; set; }public string Photo { get; set; }    }

然后读取指定目录下的照片列表,放到List列表里:(这里最开始的时候是写了一个xml文件,后来一想这不是多此一举么,直接读文件目录不就行了。)

/// <summary>/// Inits the data.初始化人员数据/// </summary>        protected void InitData()        {//以下方法是从xml文件中读取,为了方便,可以直接从目录中读取图片列表            #region 从xml文件中读取//XmlDocument xdoc = new XmlDocument();//xdoc.Load("Persons.xml");//XmlElement root = xdoc.DocumentElement; //foreach (XmlNode temp in root.ChildNodes)//{//    Person tempPerson = new Person();//    tempPerson.Name = temp.FirstChild.Value;//    persons.Add(tempPerson);//}            #endregionstring folderPath = "persons";            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(folderPath);            FileInfo[] fis = di.GetFiles();if (fis == null)            {                MessageBox.Show("没有图片!");                App.Current.Shutdown();            }else            {foreach (FileInfo fi in fis)                {                                     Person tempPerson = new Person();//这里直接获取图片文件名,包括扩展名,方便在图片控件中直接绑定                    tempPerson.Name = fi.Name.Substring(0, fi.Name.Length - 4);                    tempPerson.Photo = @"persons/" + fi.Name;                    persons.Add(tempPerson);                }            }

        }

抽奖的时候随机显示人员照片及姓名:

xaml:

<StackPanel Name="pnlRandom" Orientation="Vertical" ><Image Name="imgPerson" Width="300" Height="400"  Source="{Binding Photo,Converter={StaticResource ImgConverter}}" Stretch="UniformToFill" Margin="0,10,0,0"></Image><Label x:Name="lblNameShow" HorizontalAlignment="Center" VerticalAlignment="Bottom"  FontSize="100" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="#fff45b"/></StackPanel>

之前绑定是直接写的 Source="{Binding Photo} ,这样也可以显示,但必须把图片加入到项目里设置成“内容”才能显示出来。现在为了要达到显示没加入到项目里的图片的目的,需要加一个Converter:

    [ValueConversion(typeof(string), typeof(string))]  public class ImgConverter : IValueConverter      {public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)        {//throw new NotImplementedException();//string strSource = "/LuckyLottery;component/person/" + value + ".jpg";//return strSource;            BitmapImage img = new BitmapImage();//若要原始文件的站点,可以调用 Application 类的 GetRemoteStream 方法,同时传递标识原始文件的所需站点的 pack URI。 GetRemoteStream 将返回一个 StreamResourceInfo 对象,该对象将原始文件的该站点作为 Stream 公开,并描述其内容类型。            StreamResourceInfo info = Application.GetRemoteStream(new Uri(value.ToString(), UriKind.Relative));            img.BeginInit();//img.UriSource = new Uri(value.ToString(), UriKind.Relative);            img.StreamSource = info.Stream;            img.EndInit();return img;        }

public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)        {throw new NotImplementedException();        }    }

需要 using System.Windows.Resources;

这样图片就可以显示出来了。而且可以随意添加删除更新图片。

详细内容可参看MSDN:http://msdn.microsoft.com/zh-cn/library/aa970494.aspx

转载于:https://www.cnblogs.com/yanxiaodi/archive/2012/01/06/2314192.html

WPF中显示任意目录的图片或其他资源文件相关推荐

  1. WPF中显示GIF图片

    WPF中显示GIF图片: WPF很强大,但是他的Image控件却不支持GIF图片,只能显示第一帧.那么如何来显示GIF图片呢?以下有四种方法: 一. 第一种方法:使用MediaElement(实例中页 ...

  2. access找不到输入表或者dual_在Access窗体中显示指定路径的图片

    ↑↑↑点击上方图片,了解详情 在Access中,如果把图形对象以OLE格式的字段保存,那么在窗体中可以直接显示出图片来.但是这样做有以下不足: 一.需要将图片逐一插入到表中,工作量太大. 二.使数据库 ...

  3. 在access窗体中加图片_如何在Access窗体中显示指定路径的图片

    在Access中,如果把图形对象以OLE格式的字段保存,那么在窗体中可以直接显示出图片来.但是这样做有以下不足:一.需要将图片逐一插入到表中,工作量太大.二.使数据库文件变得庞大.三.相同的图片文件, ...

  4. 在WPF中显示动态GIF(转)

    http://www.silverlightchina.net/html/study/WPF/2011/0824/9965.html 在我们寻求帮助的时候,最不愿意听到的答复是:很抱歉,在当前版本的产 ...

  5. 在水晶报表中动态显示任意格式的图片

    在水晶报表中动态显示任意格式的图片 如何在水晶报表中动态显示任意格式的图片        前段时间,Accounting 项目内需要在水晶报表中动态显示任意格式的图片.但是,水晶报表只支持OleDb的 ...

  6. WPF中删除打开过的图片

    WPF中删除打开过的图片 原文:WPF中删除打开过的图片 在WPF中,当我们删除打开过的图片时,往往会遇到"...无法删除,文件正在被另一个进程使用"的异常.即使当前文件是打开后关 ...

  7. wpf时间显示代码_如何在ASP.NET和WPF中显示QR代码

    wpf时间显示代码 I've half-jokingly said that there's never a good reason to use a QR Code. However, I'm wo ...

  8. GridView中显示数据库里的图片

    GridView中显示数据库里的图片 很 多人开始有这个疑问,GridView控件中的ImageField没有DataField属性,那么如何才能绑定到SQL Server中的Image Field? ...

  9. 第37篇 Android Studio实现点击图片显示信息(四)布局及资源文件

    第37篇 Android Studio实现点击图片显示信息(四)布局及资源文件 4.布局文件 4.1.strings.xml 4.布局文件 整体是一个垂直布局,然后在设置一些水平布局就行了. < ...

最新文章

  1. GeoTrust 企业(OV)型 SSL证书
  2. python手动绘图_建筑师为什么要会python编程?
  3. (chap4 IP协议) 多播和子网掩码
  4. python模块和类_Python类、模块、包的区别
  5. [leetcode]Edit Distance
  6. 高等数理统计(part5)--分布族的完备性
  7. DebugView输出调试信息
  8. C++ 11 深度学习(六)智能指针综述
  9. c free语言自定义函数,C 语言free函数的工作原理
  10. 酒店叫醒系统服务器,酒店叫醒服务的流程
  11. VScode 安装与简单配置(转载)
  12. SCADA数采HAAS数控系统现场实操步骤
  13. 佳蓝php智能应答系统|在线客服 v1.0,佳蓝PHP智能应答系统|在线客服 v1.0
  14. scratch实现秋天的画
  15. 如何批量下载央视CNTV的节目视频
  16. 教大家集中注意力的训练方法
  17. 关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
  18. 微机原理 单片机笔记
  19. mysql 家谱树查询_GitHub - chenwei/FamilyTreeView: 家谱树绘制Demo
  20. TERMIOS详解【转】

热门文章

  1. 曲率多项式转换为直角坐标系
  2. mysql sign_mysql - 随笔分类 - signheart - 博客园
  3. Android项目跑不起来,本机的android虚拟机跑不起android小项目
  4. mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?......
  5. php soap详解,关于PHP+SOAP详解
  6. ant vue 离线文档_超全离线开发手册
  7. -组件基础-局部组件 // 局部组件的简写
  8. maven添加本地包命令mvn install:install-file
  9. 爱奇艺的测试工程师笔试题
  10. 5-2 Windows消息队列 (25分)