WPF中显示任意目录的图片或其他资源文件
最近在做一个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中显示任意目录的图片或其他资源文件相关推荐
- WPF中显示GIF图片
WPF中显示GIF图片: WPF很强大,但是他的Image控件却不支持GIF图片,只能显示第一帧.那么如何来显示GIF图片呢?以下有四种方法: 一. 第一种方法:使用MediaElement(实例中页 ...
- access找不到输入表或者dual_在Access窗体中显示指定路径的图片
↑↑↑点击上方图片,了解详情 在Access中,如果把图形对象以OLE格式的字段保存,那么在窗体中可以直接显示出图片来.但是这样做有以下不足: 一.需要将图片逐一插入到表中,工作量太大. 二.使数据库 ...
- 在access窗体中加图片_如何在Access窗体中显示指定路径的图片
在Access中,如果把图形对象以OLE格式的字段保存,那么在窗体中可以直接显示出图片来.但是这样做有以下不足:一.需要将图片逐一插入到表中,工作量太大.二.使数据库文件变得庞大.三.相同的图片文件, ...
- 在WPF中显示动态GIF(转)
http://www.silverlightchina.net/html/study/WPF/2011/0824/9965.html 在我们寻求帮助的时候,最不愿意听到的答复是:很抱歉,在当前版本的产 ...
- 在水晶报表中动态显示任意格式的图片
在水晶报表中动态显示任意格式的图片 如何在水晶报表中动态显示任意格式的图片 前段时间,Accounting 项目内需要在水晶报表中动态显示任意格式的图片.但是,水晶报表只支持OleDb的 ...
- WPF中删除打开过的图片
WPF中删除打开过的图片 原文:WPF中删除打开过的图片 在WPF中,当我们删除打开过的图片时,往往会遇到"...无法删除,文件正在被另一个进程使用"的异常.即使当前文件是打开后关 ...
- 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 ...
- GridView中显示数据库里的图片
GridView中显示数据库里的图片 很 多人开始有这个疑问,GridView控件中的ImageField没有DataField属性,那么如何才能绑定到SQL Server中的Image Field? ...
- 第37篇 Android Studio实现点击图片显示信息(四)布局及资源文件
第37篇 Android Studio实现点击图片显示信息(四)布局及资源文件 4.布局文件 4.1.strings.xml 4.布局文件 整体是一个垂直布局,然后在设置一些水平布局就行了. < ...
最新文章
- GeoTrust 企业(OV)型 SSL证书
- python手动绘图_建筑师为什么要会python编程?
- (chap4 IP协议) 多播和子网掩码
- python模块和类_Python类、模块、包的区别
- [leetcode]Edit Distance
- 高等数理统计(part5)--分布族的完备性
- DebugView输出调试信息
- C++ 11 深度学习(六)智能指针综述
- c free语言自定义函数,C 语言free函数的工作原理
- 酒店叫醒系统服务器,酒店叫醒服务的流程
- VScode 安装与简单配置(转载)
- SCADA数采HAAS数控系统现场实操步骤
- 佳蓝php智能应答系统|在线客服 v1.0,佳蓝PHP智能应答系统|在线客服 v1.0
- scratch实现秋天的画
- 如何批量下载央视CNTV的节目视频
- 教大家集中注意力的训练方法
- 关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
- 微机原理 单片机笔记
- mysql 家谱树查询_GitHub - chenwei/FamilyTreeView: 家谱树绘制Demo
- TERMIOS详解【转】
热门文章
- 曲率多项式转换为直角坐标系
- mysql sign_mysql - 随笔分类 - signheart - 博客园
- Android项目跑不起来,本机的android虚拟机跑不起android小项目
- mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?......
- php soap详解,关于PHP+SOAP详解
- ant vue 离线文档_超全离线开发手册
- -组件基础-局部组件 // 局部组件的简写
- maven添加本地包命令mvn install:install-file
- 爱奇艺的测试工程师笔试题
- 5-2 Windows消息队列 (25分)