WPF日积月累之文件监测与DataGrid指定Row的颜色
一、概述
关于DataGrid指定Row的颜色,我们可以使用转换器和DataGridRow的Style来实现。对于文件的检测,我们可以使用FileSystemWatcher来实现。
二、Demo
Converter代码如下:
1 using System;
2 using System.Windows.Data;
3 using System.Windows.Media;
4
5 namespace FileWatcher
6 {
7 public class BGConverter : IValueConverter
8 {
9 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
10 {
11 string operation = (string)value;
12 switch(operation)
13 {
14 case "Created":
15 return Brushes.Green;
16
17 case "Deleted":
18 return Brushes.Red;
19
20 case "Renamed":
21 return Brushes.Orange;
22 default:
23 return Brushes.Black;
24 }
25
26 }
27
28 public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
29 {
30 return null;
31 }
32 }
33 }
前台代码如下:
1 <Window x:Class="FileWatcher.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:FileWatcher"
7 mc:Ignorable="d"
8 Title="FileWatcher" Height="434.877" Width="673.774" Background="#FF387BB6">
9 <Grid>
10 <Grid.RowDefinitions>
11 <RowDefinition Height="30"/>
12 <RowDefinition Height="*"/>
13 </Grid.RowDefinitions>
14 <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
15 <Label Content="文件夹路径:" Foreground="#FF224664"></Label>
16 <TextBox Width="168" Margin="2 4 2 0" Name="tbxPath" Text="D:\MyTest\Test"></TextBox>
17 <Button Content="开始监听" Margin="60 2 8 2" Click="Button_Click" Background="#FF2E76B6"/>
18 </StackPanel>
19 <DataGrid Grid.Row="1" Margin="5" ItemsSource="{Binding FileCollection}" AutoGenerateColumns="False" Name="dataGrid" CanUserAddRows="False">
20 <DataGrid.Resources>
21 <local:BGConverter x:Key="bgconverter"/>
22 <Style TargetType="DataGridRow">
23 <Setter Property="Foreground" Value="{Binding Path=Operation, Converter={StaticResource bgconverter}}"/>
24 </Style>
25 </DataGrid.Resources>
26 <DataGrid.Columns>
27 <DataGridTemplateColumn>
28 <DataGridTemplateColumn.CellTemplate>
29 <DataTemplate>
30 <CheckBox x:Name="cbCheck" HorizontalAlignment="Center"
31 IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
32 Margin="3,2,0,0" Background="#07638a"/>
33 </DataTemplate>
34 </DataGridTemplateColumn.CellTemplate>
35 <DataGridTemplateColumn.Header>
36 <CheckBox x:Name="CheckAll" Width="auto" Content="All" Foreground="#F33A98E7" HorizontalAlignment="Center"
37 Background="Red" Margin="20 0 0 0"
38 IsChecked="{Binding DataContext.IsAllChecked, Mode=TwoWay, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=DataGrid}, UpdateSourceTrigger=PropertyChanged}"/>
39
40 </DataGridTemplateColumn.Header>
41 </DataGridTemplateColumn>
42 <DataGridTextColumn Width="100" Header="File" Binding="{Binding FileName}" IsReadOnly="True"/>
43 <DataGridTextColumn Header="Path" Width="120" Binding="{Binding FilePath}" IsReadOnly="True"/>
44 <DataGridTextColumn Header="Operation" Width="100" Binding="{Binding Operation}" IsReadOnly="True"/>
45 <DataGridTextColumn Header="Date" Width="120" Binding="{Binding Date}" IsReadOnly="True"/>
46 <DataGridTextColumn Header="Note" Width="150" Binding="{Binding Note}" IsReadOnly="False"/>
47
48
49 </DataGrid.Columns>
50 </DataGrid>
51 </Grid>
52 </Window>
后台代码如下:
1 using System;
2 using System.Collections.Generic;
3 using System.Collections.ObjectModel;
4 using System.ComponentModel;
5 using System.IO;
6 using System.Linq;
7 using System.Windows;
8
9 namespace FileWatcher
10 {
11 public abstract class ViewModelBase : INotifyPropertyChanged
12 {
13 public virtual string DisplayName { get; set; }
14
15 public event PropertyChangedEventHandler PropertyChanged;
16
17 protected void OnPropertyChanged(string propertyName)
18 {
19 PropertyChangedEventHandler handler = PropertyChanged;
20
21 if (handler != null)
22 {
23 handler(this, new PropertyChangedEventArgs(propertyName));
24 }
25 }
26
27 }
28 /// <summary>
29 /// Interaction logic for MainWindow.xaml
30 /// </summary>
31 public partial class MainWindow : Window, INotifyPropertyChanged
32 {
33 public event PropertyChangedEventHandler PropertyChanged;
34
35 protected void OnPropertyChanged(string propertyName)
36 {
37 PropertyChangedEventHandler handler = PropertyChanged;
38
39 if (handler != null)
40 {
41 handler(this, new PropertyChangedEventArgs(propertyName));
42 }
43 }
44 private List<string> fileList = new List<string>();
45 private ObservableCollection<FileInfo> fileCollection = new ObservableCollection<FileInfo>();
46 public ObservableCollection<FileInfo> FileCollection
47 {
48 get { return fileCollection; }
49 set
50 {
51 fileCollection = value;
52 OnPropertyChanged("FileCollection");
53 }
54 }
55 private bool isAllChecked;
56 public bool IsAllChecked
57 {
58 get { return isAllChecked; }
59 set
60 {
61 isAllChecked = value;
62 OnPropertyChanged("IsAllChecked");
63
64 for (int i = 0; i < FileCollection.Count; i++)
65 {
66 FileCollection[i].IsChecked = isAllChecked;
67 }
68 //OnPropertyChanged("FilaCalibrationProtocols");
69 }
70 }
71 FileSystemWatcher fsw = new FileSystemWatcher();
72 public MainWindow()
73 {
74 InitializeComponent();
75 dataGrid.DataContext = this;
76 fsw.Path = @"C:\"; //设置监控的文件目录
77 fsw.Filter = "*.*"; //设置监控文件的类型
78 fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size; //设置文件的文件名、目录名及文件的大小改动会触发Changed事件
79
80 fsw.Created += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle); //绑定事件触发后处理数据的方法。
81
82 fsw.Deleted += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle);
83
84 fsw.Changed += new FileSystemEventHandler(this.fileSystemWatcher_EventHandle);
85
86 fsw.Renamed += new RenamedEventHandler(this.fileSystemWatcher_Renamed); //重命名事件与增删改传递的参数不一样。
87
88 }
89 private void fileSystemWatcher_EventHandle(object sender, FileSystemEventArgs e) //文件增删改时被调用的处理方法
90 {
91 this.Dispatcher.BeginInvoke(
92 new Action(() =>
93 {
94
95 var fileInfo = new FileInfo() { Operation = e.ChangeType.ToString(), Date = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss"), FileName = e.Name, FilePath = e.FullPath, IsChecked = false };
96
97 if(e.ChangeType.ToString() == "Created")
98 {
99 var fileName = from file in fileList.Distinct()
100 where file == e.Name
101 select file;
102 if (fileName.Count() > 0)
103 {
104 fileInfo.Note = $"{e.Name} have already been {e.ChangeType} before.";
105 MessageBox.Show($"{e.Name} have already been {e.ChangeType} before.");
106 }
107 }
108
109 fileCollection.Add(fileInfo);
110
111 fileList.Add(e.Name);
112 })
113 );
114
115 }
116 private void fileSystemWatcher_Renamed(object sender, RenamedEventArgs e) //文件重命名时被调用的处理方法
117 {
118 this.Dispatcher.BeginInvoke(
119 new Action(() =>
120 {
121 fileCollection.Add(new FileInfo() { Operation = e.ChangeType.ToString(), Date = DateTime.Now.ToLongTimeString(), FileName = e.OldName + " --> " + e.Name, FilePath = e.FullPath, IsChecked = false });
122 fileList.Add(e.Name);
123 })
124 );
125
126 }
127
128 private void Button_Click(object sender, RoutedEventArgs e)
129 {
130 if(Directory.Exists(tbxPath.Text))
131 {
132 fsw.Path = tbxPath.Text;
133 }
134 fsw.EnableRaisingEvents = true;
135 }
136 }
137 public class FileInfo : ViewModelBase
138 {
139 private bool isChecked;
140
141 public bool IsChecked
142 { get { return isChecked; } set { isChecked = value; OnPropertyChanged("IsChecked"); } }
143
144
145 private string fileName;
146 public string FileName
147 {
148 get { return fileName; }
149 set { fileName = value; }
150 }
151
152 private string filePath;
153 public string FilePath
154 {
155 get { return filePath; }
156 set { filePath = value; }
157 }
158
159 private string operation;
160 public string Operation
161 {
162 get { return operation; }
163 set { operation = value; }
164 }
165
166 private string date;
167 public string Date
168 {
169 get { return date; }
170 set { date = value; }
171 }
172
173 private string note;
174 public string Note
175 {
176 get { return note; }
177 set { note = value; }
178 }
179
180 }
181 }
运行结果如下:
WPF日积月累之文件监测与DataGrid指定Row的颜色的更多相关文章
- WPF获取读取电脑指定文件夹中的指定文件的地址
//保存指定文件夹中的指定文件的地址 string List<string> mListUri = new List<string>(); //文件夹地址 string fol ...
- wpf将表中数据显示到datagrid示例(转)
原文:http://www.jb51.net/article/47120.htm 这篇文章主要介绍了wpf将表中数据显示到datagrid示例,需要的朋友可以参考下 a.在.xaml文件中拖入一个da ...
- WPF 中style文件的引用
原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment. ...
- Wpf读写Xaml文件
前言 本文主要介绍Wpf读写Xaml文件. 读写实现 首先我们使用XamlWriter将Wpf的对象转换为Xaml字符串,代码如下: var btn = sender as Button; strin ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)
说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...
- 将.war文件解压到指定目录
jar命令无法将.jar解压到指定目录,因为-C参数只在创建或更新包的时候可用 要将.jar文件解压到指定目录可以用unzip命令 unzip命令在windows下自带就有,不用另外下载安装 下面是将 ...
- [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...
- WPF下载远程文件,并显示进度条和百分比
WPF下载远程文件,并显示进度条和百分比 1.xaml <ProgressBar HorizontalAlignment="Left" Height="10&quo ...
随机推荐
- C预处理跨平台
#include <stdio.h> //不同的平台下引入不同的头文件 #if _WIN32 //识别windows平台 #include <windows.h> #elif ...
- [刘阳Java]_Java基础面试中的常识问题
1. anonymous inner class(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 不行,对于匿名内部类,看到的一句话 ...
- 解决Git Clone速度过慢的方法
Git Clone速度慢,原因很简单,默认的源是国外的,只需要使用国内源,速度就起飞了(当然,也没有太快,至少可以忍受了).使用方法很简单,在clone某个项目的时候将github.com替换为git ...
- 【搜索】单词方阵 luogu-1101
题目描述 给一n×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间 ...
- 七个对我最重要的职业建议)--转载来自ruanyifeng博客
原文:http://www.ruanyifeng.com/blog/2015/09/career-advice.html 一.不要别人点什么,就做什么 我的第一份工作,只干了8个月,那家公司就倒闭了. ...
- 数据分析学习1-----matplotlib
安装:Anaconda 详细见:https://blog.csdn.net/lwplwf/article/details/79162470 使用^ThinkPad-E560:~# spyder 命令 ...
- odoo12常用的方法
2019-09-13 今天是中秋节,星期五 #自定义显示名称 def name_get(self): result = [] for order in self: rec_name = "% ...
- Chrome添加 测试设备 手机iPhone x系列手机
一.F12,点击下图中的Edit,添加设备 二.添加名为iPhone XR的设备,设备配置如下 三.其中User agent string如下 Mozilla/5.0 (iPhone; CPU iPh ...
- 自学linux——10.Linux的网络知识
linux的网络知识 一.网络相关概述 1.网络的分类 局域网(LAN):在几百米到十几公里内办公楼群或校园内的计算机相互连接所构成的计算机网络 城域网(MAN):覆盖相距不远的几栋办公楼,也可以覆盖 ...
- RHCE_DAY01
shell概述 shell是一个程序,它连接了用户和Linux内核,它可以解释用户输入的命令传递给内核,让用户可以更加方便的使用Linux系统 shell 本身并不是内核的一部分,它只是站在内核的基础 ...