2011-12-19 6 views
2

ПРОБЛЕМА:Больше не отображается изображение на ListBox каждый раз выбрать элемент

Я получил answer, делая некоторую связанность от ListBoxSource к ListBoxDisplay НО странно получилось:

выбирающего и отмена выбора из элементы отлично работают и отображают точно выбранные элементы на другом ListBox с именем «ListBoxDetails BUT каждый раз, когда я выбираю элемент, изображение ушло, но выделенные выделения остаются, но в нем больше нет изображения. (Вы все же можете отменить выбор, хотя даже если больше не надо изображение, поскольку размера рабочего стола еще есть)

Примечание: У меня нет другого контроля внутри ListBoxSource (SelectionMode = Multiple) ТОЛЬКО Image

КОД XAML:

<Window.Resources> 
    <DataTemplate x:Key="ItemTemplate"> 
     <WrapPanel Height="149" Orientation="Horizontal" Width="193"> 
      <Image HorizontalAlignment="Left" Height="128" Width="180" Margin="0"/> 
     </WrapPanel> 
    </DataTemplate> 
    <ItemsPanelTemplate x:Key="ItemsPanelTemplate1"> 
     <StackPanel Orientation="Horizontal"/> 
    </ItemsPanelTemplate> 
    <ItemsPanelTemplate x:Key="ItemsPanelTemplate2"> 
     <UniformGrid x:Name="UniformGridImageList"/> 
    </ItemsPanelTemplate> 
</Window.Resources> 
<Grid x:Name="LayoutRoot"> 
    <ListBox x:Name="ListBoxSource" Width="450" Margin="9,3,442,178" ItemsPanel="{DynamicResource ItemsPanelTemplate2}" SelectionMode="Multiple" d:LayoutOverrides="GridBox" HorizontalAlignment="Left" />  
    <ListBox Name="ListBoxDisplay" Height="659" HorizontalAlignment="Right" Margin="460,5,0,0" VerticalAlignment="Top" Width="382" ItemsSource="{Binding ElementName=ListBoxSource, Path=SelectedItems}" /> 
    <Button x:Name="buttonLoadImages" Content="Button" HorizontalAlignment="Left" Height="51" Margin="33,0,0,70" VerticalAlignment="Bottom" Width="183" Style="{DynamicResource ButtonStyle1}" Click="buttonLoadImages_Click"/> 
    <Button Content="Clear" Height="55" HorizontalAlignment="Right" Margin="0,717,442,0" Name="buttonClearListBox" VerticalAlignment="Top" Width="177" Click="button1_Click" /> 

</Grid> 

КОД C# :

выше декларация:

private List<Image> _imageList = new List<Image>(); 

. . .

 private void buttonLoadImages_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 

     this._imageList = GetImageList(@"C:\Users\Public\Pictures\Sample Pictures"); 


     foreach (Image curImage in this._imageList) 
     { 

      ListBoxSource.Items.Add(curImage); 

     } 

    } 

    #region GetImageList Method 

    private List<Image> GetImageList(string strPath) 
    { 
     List<Image> imageList = new List<Image>(); 
     string strFilePath = ""; 

     if (Directory.Exists(strPath) == false) 
     { 
      MessageBox.Show(string.Format("{0} path could not be found.", strPath)); 
      return imageList; 
     } 

     try 
     { 


      DirectoryInfo dirInfo = new DirectoryInfo(strPath); 
      FileInfo[] files = dirInfo.GetFiles("*.jpg",SearchOption.AllDirectories); 


      foreach (FileInfo curFile in files) 
      { 


       strFilePath = curFile.FullName; 

       Image curImage = new Image(); 
       BitmapImage bmpImage = new BitmapImage(); 
       bmpImage.BeginInit(); 
       bmpImage.UriSource = new Uri(curFile.FullName, UriKind.Absolute); 
       bmpImage.EndInit(); 

       curImage.Height = 140; 
       curImage.Stretch = Stretch.Fill; 

       curImage.Source = bmpImage; 
       curImage.Margin = new Thickness(10); 

       imageList.Add(curImage); 
      } 

      if (imageList.Count == 0) 
       MessageBox.Show(string.Format("No image files could be found in {0}", strPath)); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(string.Format("{0}-{1}", ex.Message, strFilePath)); 
     } 

     return imageList; 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     this.listBoxSource.Items.Clear(); 
    } 
+0

Почему там WrapPanel в DataTemplate? Как установить источник изображения? Не могли бы вы разместить код C#, который также загружает ListBox? –

+0

Кажется, все в порядке. У вас есть что-то еще в вашем коде или XAML? – Rachel

+0

Кроме того, чтобы заставить его работать, я добавляю 'ItemTemplate =" {StaticResource ItemTemplate} "к обеим спискам ListBoxes. Я подумал, что ты уже это делал, но думал, что я упомянул об этом на всякий случай. – Rachel

ответ

1

Вы создаете Image объекты пользовательского интерфейса и добавление их непосредственно в ListBox.

Это означает, что SelectedItems является объектом Image UI, поэтому ListBox # 2 пытается установить его Items к точному же Image ссылки на объект. Это не разрешено в WPF, потому что объекты пользовательского интерфейса могут иметь только один родитель, однако, поскольку это ошибка привязки, WPF молчит об этом (за исключением, вероятно, предупреждения)

Я бы рекомендовал сделать ваш List<Image> в List<string> который содержит имя пути для изображения и изменение вашего <Image> в шаблоне, чтобы использовать эту строку в качестве источника. Кроме того, не забудьте установить ItemTemplate в обоих списках ListBoxes.

<DataTemplate x:Key="ItemTemplate"> 
    <WrapPanel Height="149" Orientation="Horizontal" Width="193"> 
     <Image Source="{Binding }" HorizontalAlignment="Left" Height="128" Width="180" Margin="0" /> 
    </WrapPanel> 
</DataTemplate> 

Я сделал быстрый тест, и он отлично работает, как только вы заполните ваши ListBoxes со строками вместо UI объектов

Смежные вопросы