Больше не отображается изображение в ListBox каждый раз, когда я выбираю элемент - PullRequest
2 голосов
/ 19 декабря 2011

ПРОБЛЕМА:

Я получил ответ при выполнении некоторой привязки из ListBoxSource к ListBoxDisplay НО Произошла странная вещь:

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

ПРИМЕЧАНИЕ: У меня нет другого элемента управления внутри ListBoxSource (SelectionMode = Multiple) ТОЛЬКО изображение

КОД 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();
    }

1 Ответ

1 голос
/ 19 декабря 2011

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

Это означает, что SelectedItems является Image объектом пользовательского интерфейса, поэтому ListBox # 2 пытается установить для его Items точно такую ​​же ссылку Image на объект. Это не разрешено в WPF, поскольку объекты пользовательского интерфейса могут иметь только одного родителя, однако, поскольку это ошибка Binding, 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>

Я провел быструю проверку, и она прекрасно работает, когда вы заполняете свои списки со строками вместо объектов пользовательского интерфейса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...