MVVM模式下WPF动态绑定展示图片

发布时间 - 2026-01-11 02:07:44    点击率:

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>

界面效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# MVVM  # WPF  # 动态绑定  # 图片  # Android实现MVVM架构数据刷新详解流程  # Android单项绑定MVVM项目模板的方法  # MVVM和MVVMLight框架介绍及在项目中的使用详解  # 绑定  # 的是  # 转化为  # 转换为  # 再把  # 大家多多  # 新文件  # 模式下  # throw  # Exception  # Filter  # ByteToImage  # open  # ChangedIcon  # OpenFileDialog  # buf  # PathToByte  # CurrentDirectory  # byte  # MessageHelper 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  如何在搬瓦工VPS快速搭建网站?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Laravel如何升级到最新版本?(升级指南和步骤)  网站制作软件有哪些,制图软件有哪些?  网站建设整体流程解析,建站其实很容易!  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  BootStrap整体框架之基础布局组件  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何在Windows虚拟主机上快速搭建网站?  JS碰撞运动实现方法详解  javascript读取文本节点方法小结  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  如何生成腾讯云建站专用兑换码?  bing浏览器学术搜索入口_bing学术文献检索地址  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  教你用AI润色文章,让你的文字表达更专业  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  网站制作免费,什么网站能看正片电影?  米侠浏览器网页背景异常怎么办 米侠显示修复  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  如何快速搭建高效可靠的建站解决方案?  JavaScript如何实现路由_前端路由原理是什么  Laravel如何处理异常和错误?(Handler示例)  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何在云主机上快速搭建多站点网站?  如何实现javascript表单验证_正则表达式有哪些实用技巧  如何快速生成高效建站系统源代码?  黑客如何通过漏洞一步步攻陷网站服务器?  如何在景安云服务器上绑定域名并配置虚拟主机?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  javascript中对象的定义、使用以及对象和原型链操作小结  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何快速启动建站代理加盟业务?  Laravel如何集成Inertia.js与Vue/React?(安装配置)  大连 网站制作,大连天途有线官网?  大型企业网站制作流程,做网站需要注册公司吗?