每次我选择一个项目时,列表框上不再显示图像

本文关键字:列表 不再 图像 显示图 显示 项目 选择 一个 | 更新日期: 2023-09-27 18:18:11

问题:

当从ListBoxSource到ListBoxDisplay进行一些绑定时,我得到了答案,但是发生了奇怪的事情:

项目的选择和取消选择工作正常,并在名为"ListBoxDetails "的另一个 ListBox 上准确显示所选项目,但每次我选择一个项目时,图像都会消失,但选择突出显示仍然存在,其中没有更多图像。(即使没有更多的图像,您仍然可以取消选择它,因为屏幕空间仍然存在(

注意:我在列表框源(选择模式=多个(仅图像中没有其他控件

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

每次我选择一个项目时,列表框上不再显示图像

您正在创建Image UI 对象并将它们直接添加到列表框中。

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

我建议将List<Image>制作成包含图像路径名的List<string>,并将模板中的<Image>更改为使用该字符串作为源。另外,不要忘记在两个列表框上设置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 对象填充列表框,它就会正常工作