一、概述

关于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的颜色的更多相关文章

  1. WPF获取读取电脑指定文件夹中的指定文件的地址

    //保存指定文件夹中的指定文件的地址 string List<string> mListUri = new List<string>(); //文件夹地址 string fol ...

  2. wpf将表中数据显示到datagrid示例(转)

    原文:http://www.jb51.net/article/47120.htm 这篇文章主要介绍了wpf将表中数据显示到datagrid示例,需要的朋友可以参考下 a.在.xaml文件中拖入一个da ...

  3. WPF 中style文件的引用

    原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment. ...

  4. Wpf读写Xaml文件

    前言 本文主要介绍Wpf读写Xaml文件. 读写实现 首先我们使用XamlWriter将Wpf的对象转换为Xaml字符串,代码如下: var btn = sender as Button; strin ...

  5. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  6. 在文件夹中 的指定类型文件中 查找字符串(CodeBlocks+GCC编译,控制台程序,仅能在Windows上运行)

    说明: 程序使用 io.h 中的 _findfirst 和 _findnext 函数遍历文件夹,故而程序只能在 Windows 下使用. 程序遍历当前文件夹,对其中的文件夹执行递归遍历.同时检查遍历到 ...

  7. 将.war文件解压到指定目录

    jar命令无法将.jar解压到指定目录,因为-C参数只在创建或更新包的时候可用 要将.jar文件解压到指定目录可以用unzip命令 unzip命令在windows下自带就有,不用另外下载安装 下面是将 ...

  8. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

  9. WPF下载远程文件,并显示进度条和百分比

    WPF下载远程文件,并显示进度条和百分比 1.xaml <ProgressBar HorizontalAlignment="Left" Height="10&quo ...

随机推荐

  1. C语言:已知三角形三边长求面积

    //已知三角形三边长求面积 #include <stdio.h> #include <math.h> int main() { float a,b,c,p,s; int x=0 ...

  2. excel vslookup应用举例

    excel vslookup应用举例 =vslookup("第一个需要查找的对象","查找的区域范围","查找的最终目标在区域的第几列",& ...

  3. NDT匹配: The Normal Distributions Transform: A New Approach to Laser Scan

    介绍 大多数激光匹配算法都是基于点或者线的特征匹配,该论文提出一种2D激光扫描匹配算法,方法类似于占据栅格,将2D平面分为一个个cell,对于每个cell,设定其一个正态分布,表示该网格测量到每个点的 ...

  4. Navicat Premium 12安装及破解

    特别提醒,Navicat Premium 12安装包请用我给的链接下载,不然会无法破解 下载Navicat Premium 12地址:https://pan.baidu.com/s/1AQsryKpJ ...

  5. selenium 配置ie11 浏览器

    1.IEDriverServer下载与配置 用淘宝的镜像地址:https://npm.taobao.org/mirrors/selenium/. 选3.0版本的  IEDriverServer_x64 ...

  6. Intouch/ifix语音报警系统制作(4-自动发送邮件提醒)

    在近期项目完成后,有遇到情况:类似于语音报警后,中控室人员未及时报告给我们造成了事件的危害升级,以及造成很不好的影响.针对这个情况特此添加语音报警后,自动发送邮件提醒,完善现有的报警机制. 1.函数编 ...

  7. sqli-labs靶机

    第一关   1' 第二关   1 第三关    1') 第四关    1'') 第五关   1'     +         extractvalue报错注入 第六关   1 "  +    ...

  8. PS Lite 笔记

    本文讲解的 PS Lite 源码版本限定如下: GitHub: https://github.com/dmlc/ps-lite/tree/master Commit: f45e2e78a7430be0 ...

  9. Centos LInux 7.0 内核3.1 升级简化流程

    Centos LInux 7.0 内核3.1 升级建华流程 1)#导入ELRepo软件仓库的公共秘钥rpm --import https://www.elrepo.org/RPM-GPG-KEY-el ...

  10. 【爬虫系列】1. 无事,Python验证码识别入门

    最近在导入某站数据(正经需求),看到他们的登录需要验证码, 本来并不想折腾的,然而Cookie有效期只有一天. 已经收到了几次夜间报警推送之后,实在忍不住. 得嘞,还是得研究下模拟登录. 于是,秃头了 ...