2012-02-17 74 views
1

我正在使用过渡幻灯片控件,该控件具有绑定到itemsource的可观察集合的字符串。这些字符串是幻灯片中每张图片的文件路径。当我首先加载WPF应用程序,它运行正确此方法(使用的目录路径,以产生PicSlideShowCollection):绑定Observable集合上的GeneratorPosition错误

public void SelectImages(string path) 
    { 
     // Validate 
     if (string.IsNullOrEmpty(path)) throw new ArgumentException("path"); 

     PicSlideShowCollection.Clear();   


     // Get directory info for specified path 
     DirectoryInfo di = new DirectoryInfo(path); 

     // Image mask 
     string[] extensions = new string[] { "*.jpg", "*.png", "*.gif", "*.bmp" }; 

     // Search for all 
     foreach (string extension in extensions) 
     { 
      foreach (FileInfo fi in di.GetFiles(extension.ToLower())) 
      { 
       PicSlideShowCollection.Add(fi.FullName);      
      } 
     }   
    } 

然而,我有一个按钮,允许用户改变图像中使用的目录幻灯片并重新运行上述方法。执行该操作时,出现此错误:

GeneratorPosition '-1,1' passed to Remove does not have Offset equal to 0.

这发生在PicSlideShowCollection.Clear()指令上。 如果我评论该指令,新的目录图像将被添加到原始目录图片,而这不是我想要的。

我知道这与PicSlideShowCollection被用作Slide show控件的项目源有关,但我需要知道如何防止发生此错误。

谢谢!

回答

0

我无法解释为何发生此错误。 GeneratorPosition由ItemsControl的ItemContainerGenerator使用,当您绑定到其ItemsSource属性并将项目添加到源集合或从源集合中删除项目时,该项目应该会很简单。清理源收集当然也是一个有效的操作。

问题的一个可能的解决方法是每次切换到另一个图像目录时重置ItemsSource。因此,而不是清除现有的集合的

PicSlideShowCollection.Clear(); 

创建一个新的集合和设置的ItemsSource为新的集合:

PicSlideShowCollection = new ObservableCollection<string>(); 
slideShowControl.ItemsSource = PicSlideShowCollection; 
+0

是的,我已经试过了。我在该方法中构建了另一个集合,并尝试将ItemsSource切换到它并发生相同的错误。它可能与幻灯片一次迭代一个来源中的项目,当我更新集合,它是在某个项目的位置或索引? – sunriser 2012-02-17 17:27:45

+0

是的,但后来我把它称为幻灯片控制中的错误。应始终可以修改源集合。该控件的文档是否说明了可能的状态,其中禁止对源集合进行更改? – Clemens 2012-02-17 17:34:34

+0

不幸的是,不,我阅读了整个API指南并查看了示例代码,并且没有解决这个问题。我尝试的其他事情:设置控制启用为false然后重新启用,将itemsource设置为null,然后重新绑定到集合,使用slideshowcontrol的Items成员并手动添加项目。所有产生相同的错误。 :( – sunriser 2012-02-17 17:41:46

0
Slideshow.AutoAdvance = false; 

Slideshow.SelcetedIndex=-1; 

var count=PicSlideShowCollection.Count; 

forearch(var item in newsources) 
{ 
PicSlideShowCollection.Add(item); 
} 

while(count--) 
PicSlideShowCollection.RemoveAt(0); 

Slideshow.SelcetedIndex=0; 
+0

请在此代码中添加一些解释。它是否适合原始代码,它是如何解决这个问题的? – m69 2015-12-19 04:21:02