如何使用 WPF/c# 将快捷方式文件夹显示到 DataGrid 或其他控件中
How to display a folder of shortcuts into a DataGrid or another control using WPF/c#
我有一个包含快捷方式的文件夹 (X:\Shortcuts),它可以有以下扩展名
LNK, URL, EXE
我想显示快捷方式(名称和图标)的网格,以便用户可以 select 它们,它们将被复制到 H:\Desktop 如果否则存在 %USERPROFILE%\Desktop
我不需要有关复制文件的帮助。我需要有关在我的 WPF 应用程序中将文件夹的内容显示为网格的帮助
有人推荐我 http://www.wpfsharp.com/2012/10/23/displaying-images-from-a-folder-with-details-in-wpf/
但这假定文件夹中充满了图像。
我的Code-behind代码
private ObservableCollection<Shortcut> shortcutItems;
public ObservableCollection<Shortcut> ShortcutItems
{
get { return shortcutItems; }
set { shortcutItems = value; }
}
private ObservableCollection<Shortcut> GetIcons()
{
if (shortcutItems == null)
shortcutItems = new ObservableCollection<Shortcut>();
shortcutItems.Clear();
foreach (var item in Directory.GetFiles(path).Where(x => x.EndsWith(".lnk")))
{
var icc = Icon.ExtractAssociatedIcon(item);
shortcutItems.Add(new Shortcut()
{
Name = System.IO.Path.GetFileName(item.Substring(0, item.Length - 4)),
BitMapIcon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(icc.Handle,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())
});
}
return shortcutItems;
}
private void getShortCuts()
{
shortcutItems = GetIcons();
}
我的全部XAML
<UserControl x:Class="Camden_Automated_Help_Desk.AvailableShortcuts"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Camden_Automated_Help_Desk"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<DataGrid ItemsSource="{Binding ShortcutItems}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Icons">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding BitMapIcom}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
<Button x:Name="buttonCopy" Content="Copy Shortcuts" HorizontalAlignment="Left" Margin="165,265,0,0" VerticalAlignment="Top" Width="125" FontSize="16"/>
<Button x:Name="buttonReset" Content="Refresh" HorizontalAlignment="Left" Margin="10,265,0,0" VerticalAlignment="Top" Width="125" FontSize="16" Click="buttonReset_Click"/>
</Grid>
</UserControl>
我看到 header 显示单词图标和标签名称,但我在 DataGrid 中看不到图标或图标的名称
您需要从 shortcut/file 中提取图标。
我创建了以下快捷方式 class,它有一个名称 属性 和一个位图(图像)属性。
public class Shortcut
{
public Shortcut()
{
}
public string Name { get; set; }
public BitmapSource BitMapIcom { get; set; }
}
在我的 MainViewModel 中声明了一个名为 ShortcutItems 的 ObservableCollection of Shortcuts 并使用以下方法用文件夹中的 'items' 填充集合。
private ObservableCollection<Shortcut> shortcutItems;
public ObservableCollection<Shortcut> ShortcutItems
{
get { return shortcutItems; }
set { shortcutItems = value; }
}
private ObservableCollection<Shortcut> GetIcons()
{
if (shortcutItems == null)
shortcutItems = new ObservableCollection<Shortcut>();
shortcutItems.Clear();
foreach (var item in Directory.GetFiles(@"C:\Users\albErt\Desktop").Where(x => x.EndsWith(".lnk")))
{
var icc = Icon.ExtractAssociatedIcon(item);
shortcutItems.Add(new Shortcut()
{
Name = System.IO.Path.GetFileName(item.Substring(0, item.Length - 4)),
BitMapIcom = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(icc.Handle,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())
});
}
return shortcutItems;
}
并且在视图模型构造函数中只是 ShortcutItems = GetIcons();
确保您的目录路径正确。
它遍历所有扩展名为“.lnk”(快捷方式)的文件。从路径中提取图标并将其转换为位图。它并不完美,但它可以检索图标。
我使用 DataGrid 来测试图标是否显示。如果您使用数据网格,只需将 ObservableCollection 添加为 Itemssource 并为图像创建一个模板列:
这个数据网格是我 XAML 中唯一的东西,除此之外,我在代码后面设置了数据上下文。
<DataGrid ItemsSource="{Binding ShortcutItems}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Icons">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding BitMapIcom}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
</DataGrid.Columns>
这就是使用列表视图的方式:
<ListView ItemsSource="{Binding ShortcutItems}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Icon">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding BitMapIcom}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
</GridView>
</ListView.View>
</ListView>
我有一个包含快捷方式的文件夹 (X:\Shortcuts),它可以有以下扩展名
LNK, URL, EXE
我想显示快捷方式(名称和图标)的网格,以便用户可以 select 它们,它们将被复制到 H:\Desktop 如果否则存在 %USERPROFILE%\Desktop
我不需要有关复制文件的帮助。我需要有关在我的 WPF 应用程序中将文件夹的内容显示为网格的帮助
有人推荐我 http://www.wpfsharp.com/2012/10/23/displaying-images-from-a-folder-with-details-in-wpf/
但这假定文件夹中充满了图像。
我的Code-behind代码
private ObservableCollection<Shortcut> shortcutItems;
public ObservableCollection<Shortcut> ShortcutItems
{
get { return shortcutItems; }
set { shortcutItems = value; }
}
private ObservableCollection<Shortcut> GetIcons()
{
if (shortcutItems == null)
shortcutItems = new ObservableCollection<Shortcut>();
shortcutItems.Clear();
foreach (var item in Directory.GetFiles(path).Where(x => x.EndsWith(".lnk")))
{
var icc = Icon.ExtractAssociatedIcon(item);
shortcutItems.Add(new Shortcut()
{
Name = System.IO.Path.GetFileName(item.Substring(0, item.Length - 4)),
BitMapIcon = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(icc.Handle,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())
});
}
return shortcutItems;
}
private void getShortCuts()
{
shortcutItems = GetIcons();
}
我的全部XAML
<UserControl x:Class="Camden_Automated_Help_Desk.AvailableShortcuts"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Camden_Automated_Help_Desk"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<DataGrid ItemsSource="{Binding ShortcutItems}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Icons">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding BitMapIcom}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
</DataGrid.Columns>
</DataGrid>
<Button x:Name="buttonCopy" Content="Copy Shortcuts" HorizontalAlignment="Left" Margin="165,265,0,0" VerticalAlignment="Top" Width="125" FontSize="16"/>
<Button x:Name="buttonReset" Content="Refresh" HorizontalAlignment="Left" Margin="10,265,0,0" VerticalAlignment="Top" Width="125" FontSize="16" Click="buttonReset_Click"/>
</Grid>
</UserControl>
我看到 header 显示单词图标和标签名称,但我在 DataGrid 中看不到图标或图标的名称
您需要从 shortcut/file 中提取图标。
我创建了以下快捷方式 class,它有一个名称 属性 和一个位图(图像)属性。
public class Shortcut
{
public Shortcut()
{
}
public string Name { get; set; }
public BitmapSource BitMapIcom { get; set; }
}
在我的 MainViewModel 中声明了一个名为 ShortcutItems 的 ObservableCollection of Shortcuts 并使用以下方法用文件夹中的 'items' 填充集合。
private ObservableCollection<Shortcut> shortcutItems;
public ObservableCollection<Shortcut> ShortcutItems
{
get { return shortcutItems; }
set { shortcutItems = value; }
}
private ObservableCollection<Shortcut> GetIcons()
{
if (shortcutItems == null)
shortcutItems = new ObservableCollection<Shortcut>();
shortcutItems.Clear();
foreach (var item in Directory.GetFiles(@"C:\Users\albErt\Desktop").Where(x => x.EndsWith(".lnk")))
{
var icc = Icon.ExtractAssociatedIcon(item);
shortcutItems.Add(new Shortcut()
{
Name = System.IO.Path.GetFileName(item.Substring(0, item.Length - 4)),
BitMapIcom = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(icc.Handle,
System.Windows.Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions())
});
}
return shortcutItems;
}
并且在视图模型构造函数中只是 ShortcutItems = GetIcons(); 确保您的目录路径正确。 它遍历所有扩展名为“.lnk”(快捷方式)的文件。从路径中提取图标并将其转换为位图。它并不完美,但它可以检索图标。 我使用 DataGrid 来测试图标是否显示。如果您使用数据网格,只需将 ObservableCollection 添加为 Itemssource 并为图像创建一个模板列: 这个数据网格是我 XAML 中唯一的东西,除此之外,我在代码后面设置了数据上下文。
<DataGrid ItemsSource="{Binding ShortcutItems}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Icons">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding BitMapIcom}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
</DataGrid.Columns>
这就是使用列表视图的方式:
<ListView ItemsSource="{Binding ShortcutItems}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Icon">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image Source="{Binding BitMapIcom}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
</GridView>
</ListView.View>
</ListView>