MVVM模式下WPF动态绑定展示图片
技术  /  管理员 发布于 7年前   413
MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示。
首先在ViewModel中
//属性定义 BitmapImage _ImageSource; /// <summary> /// 显示的图标 /// </summary> public BitmapImage ImageSource { get { return _ImageSource; } set { _ImageSource = value; NotifyOfPropertyChange("ImageSource"); } } string _ImagePath; /// <summary> /// 显示的图标路径 /// </summary> public string ImagePath { get { return _ImagePath; } set { _ImagePath = value; NotifyOfPropertyChange("ImagePath"); } }
//初始化数据//编辑的时候绑定数据public GroupInfoViewModel(sys_Right_Group groupInfo, OperType type) { if (type == OperType.Edit || type == OperType.Show) { IsAdd = false; TitleName = "编辑分组"; RightGroup = groupInfo; ImagePath = groupInfo.ImagePath; GetImgData(groupInfo.ImagePath); } } /// <summary> /// 获取图片数据 /// </summary> /// <param name="imgPath">相对路径</param> private void GetImgData(string imgPath) { if (string.IsNullOrEmpty(imgPath)) return; try { string fileName = System.Environment.CurrentDirectory + imgPath; //获取文件的绝对路径 byte[] buf; if (!PathToByte(fileName, out buf)) { MessageHelper.ShowAutoCloseWarning("获取图标失败"); return; } ImageSource =ByteToImage(buf); } catch (Exception ex) { throw ex; } }
//界面选择图片按钮事件 /// <summary> /// 修改图片 /// </summary> public void ChangedIcon() { try { OpenFileDialog open = new OpenFileDialog(); open.Filter = string.Format("照片|*.jpg;*.jpeg;*.png;*.gif;*.bmp"); if (open.ShowDialog() == true) { var path = open.FileName; //检查图标目录,绝对路径下面 string NewPath = System.Environment.CurrentDirectory + @"\Images\Tile\Group\"; string newFile = NewPath + Path.GetFileName(path); if (!System.IO.Directory.Exists(NewPath)) {System.IO.Directory.CreateDirectory(NewPath); } File.Copy(path, newFile, true); //复制文件到目录绝对路径文件夹 FileInfo info = new FileInfo(newFile); //新文件 if (info.Length > MenuViewModel.UserImageMaxLength) {MessageHelper.ShowAutoCloseWarning(string.Format("图标不能大于{0}M", MenuViewModel.UserImageMaxLength / 1024 / 1024));return; } byte[] buf; if (!PathToByte(path, out buf)) {MessageHelper.ShowAutoCloseWarning("修改失败");return; } ImageSource = ByteToImage(buf); ImagePath = @"\Images\Tile\Group\" + Path.GetFileName(path); //显示相对路径 } } catch (Exception ex) { throw ex; } }
点击保存的时候再把相对路径保存到数据库RightGroup.ImagePath = ImagePath;
//公共帮助方法//把图片文件转换为byte数组 public static bool PathToByte(string path, out byte[] buffer) { FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); try { buffer = new byte[fs.Length]; fs.Read(buffer, 0, (int)fs.Length); return true; } catch (Exception ex) { buffer = null; return false; } finally { if (fs != null) { //关闭资源fs.Close(); } } }//把byte数组转化为BitmapImage public static BitmapImage ByteToImage(byte[] buf) { BitmapImage bmp = new BitmapImage(); bmp.BeginInit(); bmp.StreamSource = new MemoryStream(buf); bmp.EndInit(); return bmp; }
View 界面绑定代码:
<Button Grid.Row="0" Grid.Column="0" Content="选择图片" cm:Message.Attach="[Click]=[ChangedIcon()]" Style="{StaticResource BtnOperationStyle}" Height="20" Width="70"></Button> <Grid Grid.Row="0" Grid.Column="1" Background="LightGray"><Image Height="120" Width="150" Stretch="Fill" Source="{Binding ImageSource,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></Image> </Grid> <Label Grid.Row="1" Grid.Column="0" Style="{StaticResource GridColumnLabelStyle}" Content="路径:"></Label><TextBox Grid.Row="1" Grid.Column="1" Style="{StaticResource StyleForTextBox}" Text="{Binding ImagePath,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Height="30" TextAlignment="Center" IsReadOnly="True"></TextBox>
界面效果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号