每次选择项目时,ListBox上都不会显示更多图像

时间:2011-12-19 15:00:37

标签: c# .net wpf xaml

问题:

我从ListBoxSource到ListBoxDisplay进行绑定时遇到了answer 但是发生了奇怪的事情:

项目的选择和取消选择工作正常并且在另一个名为“ListBoxDetails 的ListBox上精确显示所选项目,每当我选择一个项目图像消失但选择亮点仍然存在但没有更多它中的图像。(即使没有更多图像,你仍然可以取消选择它,因为屏幕空间仍在那里)

注意:我在ListBoxSource中没有其他控件(SelectionMode = Multiple)ONLY Image

CODE 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>

CODE 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();
    }

1 个答案:

答案 0 :(得分:1)

您正在创建Image UI对象并将其直接添加到ListBox。

这意味着SelectedItems是一个Image UI对象,因此ListBox#2正在尝试将其Items设置为完全相同的Image对象引用。这在WPF中是不允许的,因为UI对象只能有一个父对象,但是因为它是一个Binding错误,所以WPF对此保持沉默(可能是警告除外)

我建议您将List<Image>变为List<string>,其中包含图片的路径名,并更改模板中的<Image>以使用该字符串作为源。另外,不要忘记在两个ListBox上设置ItemTemplate

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

我做了一个快速测试,一旦你使用字符串而不是UI对象填充ListBox,它就能正常工作