Files
ClientServerProject/软件系统客户端Wpf/Views/UserFileRenderItem.xaml.cs

210 lines
6.8 KiB
C#

using ClientsLibrary;
using HslCommunication.Enthernet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using HslCommunication;
using System.Threading;
using System.IO;
using System.Net;
using ClientsLibrary.FileSupport;
namespace Wpf.Views
{
/// <summary>
/// UserFileRenderItem.xaml 的交互逻辑
/// </summary>
public partial class UserFileRenderItem : UserControl
{
#region Constructor
public UserFileRenderItem(IntegrationFileClient client, string factory, string group, string id, Func<GroupFileItem, bool> deleteCheck)
{
InitializeComponent();
DeleteCheck = deleteCheck;
m_Factory = factory;
m_Group = group;
m_Id = id;
fileClient = client;
}
#endregion
#region Private Method
private BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap)
{
BitmapImage bitmapImage = new BitmapImage();
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms, bitmap.RawFormat);
bitmapImage.BeginInit();
bitmapImage.StreamSource = ms;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
bitmapImage.Freeze();
}
return bitmapImage;
}
#endregion
#region Render File Information
/// <summary>
/// 设置文件数据
/// </summary>
/// <param name="file">文件的信息对象</param>
/// <param name="deleteEnable">删除控件的使能委托</param>
/// <exception cref="ArgumentNullException">file参数不能为空</exception>
public void SetFile(GroupFileItem file, Func<bool> deleteEnable)
{
fileItem = file;
// 设置文件图标
FileIcon.Source = BitmapToBitmapImage(FileSupport.GetFileIcon(file.FileName));
FileName.Text = "文件名称:" + file.FileName;
FileSize.Text = "大小:" + file.GetTextFromFileSize();
FileDate.Text = "日期:" + file.UploadTime.ToString("yyyy-MM-dd");
FileDescription.Text = "文件备注:" + file.Description;
FilePeople.Text = "上传人:" + file.Owner;
FileDownloadTimes.Text = "下载数:" + file.DownloadTimes;
FileDeleteButton.IsEnabled = deleteEnable.Invoke();
FileDownloadButton.IsEnabled = true; // 一般都是允许下载,如果不允许下载,在此处设置
}
#endregion
#region Delete Support
private void FileDeleteButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
// 删除文件
if (DeleteCheck != null)
{
// 删除的权限检查
if (!DeleteCheck.Invoke(fileItem))
{
// 没有通过
return;
}
}
if (MessageBox.Show("请确认是否真的删除?", "删除确认", MessageBoxButton.YesNo) == MessageBoxResult.No)
{
return;
}
//确认删除
OperateResult result = fileClient.DeleteFile(
fileItem.FileName, // 文件的名称
m_Factory, // 第一大类
m_Group, // 第二大类
m_Id // 第三大类
);
if (result.IsSuccess)
{
MessageBox.Show("删除成功!");
}
else
{
MessageBox.Show("删除失败!原因:" + result.Message);
}
}
#endregion
#region Download Support
private void FileDownloadButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//下载文件
FileDownloadButton.IsEnabled = false;
Thread thread_down_file = new Thread(new ThreadStart(ThreadDownloadFile));
thread_down_file.IsBackground = true;
thread_down_file.Start();
}
private void ThreadDownloadFile()
{
string save_file_name = AppDomain.CurrentDomain.BaseDirectory + "download\\files";
if (!Directory.Exists(save_file_name))
{
Directory.CreateDirectory(save_file_name);
}
save_file_name += "\\" + fileItem.FileName;
OperateResult result = fileClient.DownloadFile(
fileItem.FileName,
m_Factory,
m_Group,
m_Id,
(m, n) =>
{
Dispatcher.Invoke(new Action(() =>
{
FileDownloadProgress.Value = m * 100 / n;
}));
},
save_file_name
);
Dispatcher.Invoke(new Action(() =>
{
if (result.IsSuccess)
{
if (MessageBox.Show("下载完成,路径为:" + save_file_name + Environment.NewLine +
"是否打开文件路径?", "打开确认", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
{
System.Diagnostics.Process.Start("explorer.exe", @"/select," + save_file_name);
}
}
else
{
MessageBox.Show("下载失败,错误原因:" + result.Message);
}
FileDownloadButton.IsEnabled = true;
}));
}
#endregion
#region Private Members
private IntegrationFileClient fileClient; // 进行文件操作的客户端
private Func<GroupFileItem, bool> DeleteCheck; // 删除操作时的检查方法
private GroupFileItem fileItem; // 本控件关联显示的文件
private string m_Factory; // 文件的第一大类
private string m_Group; // 文件的第二大类
private string m_Id; // 文件的第三大类
#endregion
}
}