【问题标题】:Loop through folder of images and show images one by one循环浏览图像文件夹并一张一张显示图像
【发布时间】:2013-01-23 17:04:16
【问题描述】:

我是 c# 和 WPF 的新手,我正在尝试构建一个循环遍历文件夹并一张一张显示里面的图像的应用程序。当显示最后一个时,它需要再次显示第一个。

我尝试将所有文​​件命名为 1.jpg 、 2.jpg 等,然后循环浏览图片数量。但是,如果我删除一个,则会出现错误。

有没有更好的方法来完成这个?

我正在使用 C# 和一个 WPF 窗口,其中有一个网格内的图像。

任何帮助将不胜感激!

编辑:当前代码

private string[] files;
    private System.Timers.Timer timer;

    private int counter;
    private int Imagecounter;

    public IntroScreen()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(this.MainWindow_Loaded);
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {

        setupPics();
    }



    private void setupPics() 
    {
        timer = new System.Timers.Timer();
        timer.Elapsed += new ElapsedEventHandler(timer_Tick);
        timer.Interval = (2000);
        timer.Enabled = true;
        timer.Start();

        files = Directory.GetFiles("../../Resources/Taken/", "*.jpg", SearchOption.TopDirectoryOnly);
        Imagecounter = files.Length;
        counter = 0;
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        counter++;

       Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() =>
            {
                Picture.Source = new BitmapImage(new Uri(files[counter - 1], UriKind.Relative));
            }));

       if (counter == Imagecounter)
       {
           counter = 0;
       }

    }

这不起作用,它找到文件夹中的项目,但图像没有改变。

它不返回错误,只是不显示图像。

大家有什么建议吗?

【问题讨论】:

  • 错误是什么?您是否在遍历图像集合时尝试删除?
  • 好吧,这并不是一个错误,但我会计算文件夹中的图片数量,然后从 1 循环到最后。但是当我删除一个例如并添加另一个时。我会加载一张没有来源的图片,并且它不会响亮最后一张图片,因为它不会循环直到那张。
  • 您能否发布一些代码以便我们为您提供帮助?我怀疑你应该从 0 开始循环。
  • -1。太模糊了。 “它给了我一个错误”是不够的。发布您的代码。发布您的 XAML。发布异常或您遇到的任何错误。至少尝试模拟您有兴趣解决它而不是让别人为您解决它。
  • 如果用一些代码更新了我的帖子,我会走得更远,但我仍然无法显示图像,可能与我的路径有关?

标签: c# wpf


【解决方案1】:

以下使用 RX 对我有用。

Xaml

<Image Grid.Row="1" Source="{Binding AppViewModel.MainImageSource}"  Width="400" Stretch="Uniform"  Margin="{StaticResource MarginNormalControl}" />

查看模型:

SlideshowImages = ( from path in Directory.EnumerateFiles( pathSlideshow )
                    select new Uri( path ) ).ToList();
if ( SlideshowImages.Any() )
{ 
    SlideshowIndex = 0;
    var timer = Observable.Interval( TimeSpan.FromSeconds( 2 ) ).TimeInterval();
    timer.Subscribe( _ =>
                 {
                     ++SlideshowIndex;
                     if ( SlideshowIndex >= SlideshowImages.Count() )
                         SlideshowIndex = 0;
                     MainImageSource = SlideshowImages[SlideshowIndex];
                 } );
}

【讨论】:

  • 奇怪,由于某种原因,我的 xaml 没有显示
  • appViewModel 是你的控制器文件吗?
  • 这是一个“子”视图模型。不确定WPF中的控制器是什么意思。忽略它并想象一个如下属性(我使用的是 RXUI,所以忽略 set{} 中的代码。Uri _MainImageSource = null; public Uri MainImageSource { get { return _MainImageSource; } set { this.RaiseAndSetIfChanged(value); } }
  • 我收到此错误错误 1“IntroScreen”不包含“RaiseAndSetIfChanged”的定义,并且找不到接受“IntroScreen”类型的第一个参数的扩展方法“RaiseAndSetIfChanged”(您是否缺少使用指令还是程序集引用?)
  • 正如我所说,我正在使用 MVVM 库 ReactiveUI,您需要使用自己的 MVVM 库来设置 {} 代码来通知属性更改以更新绑定属性。这在 SO 的许多地方都得到了回答。这是一个例子*.com/questions/8062436/…
最近更新 更多