WPF(C#)学习日志8:Prism框架下的图像文件操作

1.应用需求

在实际处理业务逻辑时,往往会要求打开或者保存文件,本章节探讨并测试一些简单的图像文件操作的IO,测试NET上的API。因此第一个DEMO设计一个简单的窗口,实现通过WINDOWS的文件管理界面,将任意的图片加载到窗口中,如下图所示。

在C#中处理图片文件可以使用.NET Framework提供的System.Drawing命名空间,或者使用更现代的.NET Core/.NET 5+中的System.Drawing.Common库。

2.调用API对象分析

OpenFileDialog 是一个用于显示文件选择对话框的类,它允许用户从文件系统中选择文件。在 WPF 应用程序中,你可以使用 OpenFileDialog 来让用户选择一个或多个文件。

(1).定义一个打开文件的会话,如下段代码:

using Microsoft.Win32;

OpenFileDialog openFileDialog = new OpenFileDialog();


openFileDialog.Title = "选择文件";
openFileDialog.InitialDirectory = @"C:\Users\Username\Documents";
openFileDialog.Filter = "文本文件 (*.txt)|*.txt|所有文件 (*.*)|*.*";
openFileDialog.Multiselect = true;

OpenFileDialog 定义在 Microsoft.Win32下,这与WINFROM的System.Windows.Forms 是不同的,在构建WPF的应用程序时应该谨慎选择。

你可以设置一些属性来定制文件选择对话框的外观和行为。以下是一些常用的属性:

  • Title:对话框标题。
  • InitialDirectory:对话框打开时默认显示的文件夹。
  • Filter:文件过滤器,用于指定允许选择的文件类型。
  • Multiselect:指示是否允许选择多个文件。

(2).显示会话并判断用户的选择,如下段代码:

if (openFileDialog.ShowDialog() == true)
{
    // 用户点击了确定按钮
}

(3).获取选择的文件:

用户选择的文件可以通过 FileNameFileNames 属性获取:

  • FileName:返回单个文件的路径。
  • FileNames:返回一个包含所有选择文件路径的字符串数组,仅在 Multiselect 属性为 true 时有效。
string selectedFilePath = openFileDialog.FileName;
string[] selectedFilePaths = openFileDialog.FileNames;

(4.)注销对象,释放资源(这样做有利于程序内存的优化,也可以不这样做):

openFileDialog.Dispose();

BitmapImageBitmap 是用于处理图像的两个不同的类,分别用于 WPF中处理图像数据。 与 Bitmap 不同,BitmapImage 可以在非 UI 线程上加载图像,因为它是基于 WPF 图像系统的,它会在后台自动管理图像加载和缓存。BitmapImage 对象是只读的,不能直接修改图像的像素数据。如果你需要对图像进行编辑、处理或绘制,你应该考虑使用 Bitmap 类。

(1).在XAML中定义一个图片,并进行绑定:

<Image Source="{Binding ImageSource}" Stretch="Uniform"/>

(2).给接口中的图像赋值:

BitmapImage bitmapImage = new BitmapImage(new Uri("image.jpg", UriKind.RelativeOrAbsolute));

3.DEMO工程代码:

(1).XML文件:

<UserControl x:Class="ImageProcessDemo.Modules.ModuleName.Views.ViewA"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:ImageProcessDemo.Modules.ModuleName.Views"
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True" >
    <UserControl.Resources>

        <!--按键的样式-->
        <Style x:Key="tabButton" TargetType="Button" >
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="Foreground" Value="#9e9bb0"/>
            <Setter Property="Height" Value="40"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="Margin" Value="2 10"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="Button" >
                        <Border Background="{TemplateBinding Background}" CornerRadius="15">
                            <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                        </Border>

                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="#7163ba"/>
                    <Setter Property="Foreground" Value="#ffffff"/>
                </Trigger>

            </Style.Triggers>

        </Style>
    </UserControl.Resources>
    
    <Grid Width="400">
        <!--定义行列-->
        <Grid.RowDefinitions>
            <RowDefinition Height="100"/>
            <RowDefinition Height="500"/>
        </Grid.RowDefinitions>


        <Grid Grid.Column="0" Grid.Row="0">
            <Button Content="Start" Background="#7163ba" Foreground="white" Style="{StaticResource tabButton}" Command="{Binding GetCommand}"/>
        </Grid>

        <Grid Grid.Column="0" Grid.Row="1">
            <Image Source="{Binding ImageSource}" Stretch="Uniform"/>
        </Grid>


    </Grid>
</UserControl>

(2).ViewModel文件:

using ImageProcessDemo.Core.Mvvm;
using ImageProcessDemo.Services.Interfaces;
using Microsoft.Win32;
using Prism.Commands;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;

namespace ImageProcessDemo.Modules.ModuleName.ViewModels
{
    public class ViewAViewModel : RegionViewModelBase
    {

        public DelegateCommand GetCommand { get; private set; }
        private string _message;
        private BitmapImage _imageSource;
     
        public string Message
        {
            get { return _message; }
            set { SetProperty(ref _message, value); }
        }

        public ViewAViewModel(IRegionManager regionManager, IMessageService messageService) :
            base(regionManager)
        {
            GetCommand = new DelegateCommand(Get);
            Message = messageService.GetMessage();
        }

        public override void OnNavigatedTo(NavigationContext navigationContext)
        {
            //do something
        }
        private void Get()
        {
            // 显示文件选择对话框
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Image Files (*.jpg; *.jpeg; *.png; *.bmp)|*.jpg; *.jpeg; *.png; *.bmp";
            openFileDialog.Title = "Select an Image File";
            
            if (openFileDialog.ShowDialog() == true)
            {
                string filePath = openFileDialog.FileName;

                Console.WriteLine("Selected image file: " + filePath);
                // 创建BitmapImage并设置图像源
                BitmapImage bitmapImage = new BitmapImage(new Uri(filePath));
                ImageSource = bitmapImage;
            }
    
        }
        public BitmapImage ImageSource
        {
            get { return _imageSource; }
            set
            {
                _imageSource = value;
                RaisePropertyChanged();
            }
        }
    }
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF Prism框架是一个面向对象的框架,用于开发模块化、可扩展的WPF应用程序,它基于MVVM设计模式和依赖注入技术。该框架的主要目的是能够轻松地实现可插拔的模块,公共的服务、组件和工具类的共享,同时也提供了灵活的路由、事件聚合、模块加载、导航和命令处理等机制。使用WPF Prism框架可以快速地开发出灵活的WPF应用程序,从而提高代码质量和开发效率,减少代码的维护难度。 WPF Prism框架具有以下的特点: 1. 扩展性:可以轻松地添加新的模块、服务和组件,同时也可以快速替换现有的组件。 2. 可重用性:提供了丰富的公共组件、服务和工具类,从而可以提高代码的可重用性。 3. 灵活性:提供了灵活的路由、事件聚合、模块加载和导航等机制,能够更好地满足应用程序的需求。 4. 易用性:提供了一套完整的MVVM设计模式和依赖注入技术的实践方案,从而能够更好地组织应用程序的逻辑。 总之,WPF Prism框架是一个强大的工具,能够让我们更好地开发WPF应用程序,提高代码质量和开发效率,实现可插拔的模块化和可扩展性,同时也具有灵活性和易用性。 ### 回答2: WPF Prism框架是一种面向MVVM模式的开源框架,它帮助开发人员使用模块化的方式构建可扩展、可重用和易于维护的WPF应用程序。该框架主要由Microsoft和模式仲裁者团队开发和维护,它借鉴了许多现代的软件开发理念,比如IoC容器、依赖注入和事件聚合器等。 WPF Prism框架的核心思想是将应用程序分解为许多可独立维护和扩展的模块。这些模块可以基于业务逻辑、UI、数据或任何其他特征进行分组。在该框架中,模块由各种名为“组件”的构建块组成。这些组件包括视图(View)、视图模型(ViewModel)、服务(Service)、模型(Model)等。通过基于这些组件的开发,可以实现具有高度可伸缩性和可重用性的应用程序。 为了实现这种模块化开发和组件化架构,WPF Prism框架提供了一些重要的工具和特性。例如,在该框架中可以使用依赖注入容器(如Unity)来管理组件及其依赖关系。此外,该框架还提供了一些基于事件的消息机制,可方便地实现模块间的交互和通信。 总体来说,WPF Prism框架是一种利用开源技术实现企业级应用程序开发的最佳选择。它具有良好的模块化、组件化和可扩展性特性,可以在实现复杂WPF应用程序时提高开发效率和代码质量。 ### 回答3: WPF Prism是一个基于WPF框架,它为大型应用程序提供了一种组织、设计和部署的方式。它旨在帮助开发者构建可扩展、可维护和可测试的WPF应用程序。 WPF Prism采用了面向模块的编程思想,它将整个应用程序划分为多个模块,每个模块都包含自己的逻辑和用户界面。这种模块化设计使得应用程序易于扩展和维护,同时也简化了开发流程。 WPF Prism同时提供了一组强大的工具和功能,如依赖注入、命令模式和事件聚合等,这些功能让WPF应用程序更加易于开发和测试。它还提供了一个强大的导航和区域管理系统,开发者可以使用这些系统来管理不同部分的用户界面和功能。 总之,WPF Prism是一个优秀的框架,它为开发者提供了全面的工具和功能,使得构建WPF应用程序变得更加容易和高效。它的结构良好、可扩展性强,而且可以充分利用WPF的强大功能。无论是大型企业应用程序还是小型桌面应用程序,WPF Prism都是一个理想的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值