如何在运行时动态使用图像文件作为 WPF 中的按钮内容?

How to use image files dynamically at runtime as button content in WPF?

我当前的实现循环遍历一个文件夹中的 PNG 文件,并使用该文件夹中的文件创建许多带有背景图像的按钮。

为此,在 Visual Studio 的设计时,我必须将该文件夹中的每个 PNG 的构建操作设置为 resource,然后使用如下内容

button.Content = new Image { 
             Source = new BitmapImage(new Uri(product.ImageLink ?? "",UriKind.Relative)),
             Stretch = Stretch.Fill 
             }

此方法的问题在于,每次将新的 PNG 文件添加到文件夹时,我都需要将该 PNG 文件的构建操作设置为 resource 并重新发布解决方案。

是否可以在运行时遍历文件夹中的所有 PNG 文件以将它们用作按钮内容?

只需枚举文件夹并将感兴趣的文件路径添加到 ListObservableCollection 并将其绑定到 ListBox(或任何选择的 ItemsControl) .定义一个 DataTemplate 来呈现图像按钮。您可以使用 FileSystemWatcher 来观察目录的变化。

MainWindow.xaml.cs

public partial class MainWindow : Window
{
  private const string ImageFolderPath = @"C:\SomeImages";
  public ObservableCollection<string> ImageFilePaths { get; } = new ObservableCollection<string>();

  private void OnClick(object sender, RoutedEventArgs e)
  {
    this.ImageFilePaths.Clear();
    var directoryInfo = new DirectoryInfo(ImageFolderPath);
    var enumerationOptions = new EnumerationOptions();
    foreach (string imageFilePath in directoryInfo.EnumerateFiles("*", enumerationOptions)
      .Where(fileInfo => fileInfo.Extension is ".png" or ".jpg")
      .Select(fileInfo => fileInfo.FullName))
    {
      this.ImageFilePaths.Add(imageFilePath);
    }
  }
}

MainWindow.xaml

<Window>
  <Button Content="Load Images" 
          Click="OnClick" />
  <ListBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=Window}, Path=ImageFilePaths}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <Button>
          <Image Height="96"
                 Width="96"
                 Source="{Binding}" />
        </Button>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</Window>