Learning WPF, CSharp(C#) with me | Part #1

Part #1

Subject: A Simple File Listing Utility using WPF & CSharp (C#)

Okay guys

Here I am once again! This time trying to learn WPF with C# to build my own small utilities to make my “Admin work” a lot easier. Further, I use my own blog as a reference guide most of them time! So, you are most welcome to use my “notes”

A WPF project always has two parts, XAML and the code behind. While XAML maintains the GUI part of it, Code part is where you write supporting code.

[code language=”xml” gutter=”false”]
<Window x:Class="WpflisttoGrid.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot; Title="MainWindow" Height="513" Width="877" Loaded="Window_Loaded">
<Menu DockPanel.Dock="Top" Height="24"></Menu>

<StatusBar DockPanel.Dock="Bottom" Height="24">
<StatusBarItem x:Name="StatusItem" Content="Ready" Width="Auto" HorizontalAlignment="Left" VerticalAlignment="top"></StatusBarItem>

<GroupBox x:Name="MyParameters">
<Grid x:Name="MyParameters_Grid">
<Label x:Name="lblPath" Content="Folder" HorizontalAlignment="Left" Margin="6,19,0,0" VerticalAlignment="Top"/>
<Label x:Name="lblFileType" Content="File Type" HorizontalAlignment="Left" Margin="6,47,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="txtPath" HorizontalAlignment="Left" Height="23" Margin="83,22,0,0" TextWrapping="NoWrap" VerticalAlignment="Top" Width="258"/>
<TextBox x:Name="txtType" HorizontalAlignment="Left" Height="23" Margin="83,49,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<Button x:Name="buttonFldrOpen" HorizontalAlignment="Left" Margin="346,22,0,0" VerticalAlignment="Top" Height="23" Click="buttonFldrOpen_Click" >
<StackPanel Orientation="Horizontal">
<Image Source="/Resources/folder_Open_32xMD.png" Stretch="Uniform" Height="18" Width="22"/>
<Button Content="Process" HorizontalAlignment="Left" Margin="83,84,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>

<DataGrid x:Name="Grid1" Margin="68,159,89,40" IsReadOnly="True" SelectionChanged="Grid1_SelectionChanged" MouseDoubleClick="Grid1_MouseDoubleClick" SelectionUnit="Cell"/>




and the CSharp code portion as below

[code language=”csharp” gutter=”false”]
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 System.IO;
using System.Data;
//Required for folder browswer & so
using System.Windows.Forms;

namespace WpflisttoGrid
/// Interaction logic for MainWindow.xaml
/// </summary>

public partial class MainWindow : Window
public MainWindow()
private void Button_Click(object sender, RoutedEventArgs e)
//Setup the gridview to generate columns automatically against the file lists
this.Grid1.AutoGenerateColumns = true;
//We will store the text box values into local variables for easy understanding
//You may refer them straight away as defined columns
string filepath = this.txtPath.Text;
string filetype = this.txtType.Text;
//We will build a LIST of class myFiles
//Which will have chosen columns from the directory info file info results
List<myFiles> newList = new List<myFiles>();
foreach (FileInfo myfile in (new DirectoryInfo(@filepath).GetFiles(filetype, SearchOption.AllDirectories)))
//SearchOption.TopDirectoryOnly lists files from the top folder, ie, if a folder has sub-folders within
//SearchOption.TopDirectoryOnly will isolate the top folder & list all files from it
//SearchOption.AllDirectories will recursively pick all files from all folders those match type of files PDF
//As a developer who is learning
//I will leave enhancements to your logic
//This application could have
//Files those matching certain "contents"
//You can change the SearchOption.AllDirectories to SearchOption.TopDirectoryOnly programmatically…etc
//Calculate the time difference between the file creation and as on this moment
double _fileAge = Math.Round((DateTime.Now – myfile.CreationTime).TotalDays, 0);
//Add rows to the new list using new instance of the "Constructor" myFiles by passing the file details
newList.Add(new myFiles(myfile.FullName.ToString(), myfile.CreationTime, _fileAge));
//The following you could use for showing additional details
//this.StatusItem.Content = myfileList.Count().ToString();
//this.Grid1.ItemsSource = myfileList;
this.Grid1.ItemsSource = newList;
this.Grid1.Columns[0].Header = "File Name";
this.Grid1.Columns[1].Header = "Creation Time";
this.Grid1.Columns[2].Header = "File Age(Days)";
catch (Exception ex)
System.Windows.MessageBox.Show(ex.Message + ex.Source);

private void Grid1_SelectionChanged(object sender, SelectionChangedEventArgs e)

private void Grid1_MouseDoubleClick(object sender, MouseButtonEventArgs e)
// System.Windows.MessageBox.Show()
var cellInfo = Grid1.SelectedCells[0];
var content = (cellInfo.Column.GetCellContent(cellInfo.Item) as TextBlock).Text;
catch (Exception ex)
System.Windows.MessageBox.Show(ex.Message + ex.Source);

private void buttonFldrOpen_Click(object sender, RoutedEventArgs e)
FolderBrowserDialog folderDlg = new FolderBrowserDialog();
folderDlg.ShowNewFolderButton = false; //Don’t allow users to create new folders from this dialogue
folderDlg.RootFolder = Environment.SpecialFolder.MyComputer;
// Show the FolderBrowserDialog.
DialogResult result = folderDlg.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK)
this.txtPath.Text = folderDlg.SelectedPath;
Environment.SpecialFolder root = folderDlg.RootFolder;

private void Window_Loaded(object sender, RoutedEventArgs e)
this.txtType.Text = "*.*";

public class myFiles
public string fName { get; set; }
public DateTime fCreationDate { get; set; }
public double fAge { get; set; }

public myFiles(string fname, DateTime fcdate, double fage)
fName = fname;
fCreationDate = fcdate;
fAge = fage;



This project should be used as a pilot to learn both WPF & CSharp (C#) rather than a commercial product as I am not using threading or channeling the background works. So once the Process button clicked, the GUI become irresponsive until the file lists populated, and could make a user feel the system is stuck.

Once the file list is populated in the GridView, one can double click the file name to start a fresh instance of associated program. So be careful, you may be running an executable that could cause unexpected problems.

Optionally you may download the Visual Studio Solution from here



Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.