如何使用 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>