wpf ItemsControl不显示任何图像,但似乎加载了一些东西

a2mppw5e  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(228)

我正试图加载(异步)一个图片从一个目录,将显示加载时。
在我的XAML代码中,我将一些列表绑定到数据模板:

<ScrollViewer Grid.Row="2">
            <ItemsControl x:Name="display">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding Source ,IsAsync=True}" Width="100" Height="100" Margin="5"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </ScrollViewer>

字符串
与创建的类一起:

public class ImageViewModel
{
    public ImageViewModel(string path)
    {
        Path = path;
    }
    public string Path { get; }

    private BitmapImage image;

    public BitmapImage Source
    {
        get
        {
            if (image == null)
            {
                image = new BitmapImage();
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.DecodePixelWidth = 500;
                image.UriSource = new Uri(Path);
                image.EndInit();
                image.Freeze();
            }

            return Source;
        }
    }
}


剩下的代码:

ObservableCollection<ImageViewModel> images { get; } = new ObservableCollection<ImageViewModel>();

string workingDir = "some_path";
List<string> files = new List<string>();

public MainWindow()
{
    InitializeComponent();
    display.ItemsSource = images;
    DataContext = this;
}

private void On_Loaded(object sender, RoutedEventArgs e)
{
    files = DirSearch(workingDir); //returns List of strings with paths

    foreach (string file in files)
    {
        images.Add(new ImageViewModel(file));
    }
}


因此,代码执行并执行某些操作,但不显示任何图像:

的数据

lx0bsm1f

lx0bsm1f1#

代码抛出StackOverflowException,因为Source属性getter调用

return Source;

字符串
它应该看起来像下面所示。请注意,它还使用UriKind.RelativeOrAbsolute来支持绝对和相对图像文件路径。

public BitmapImage Source
{
    get
    {
        if (image == null)
        {
            image = new BitmapImage();
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.DecodePixelWidth = 500;
            image.UriSource = new Uri(Path, UriKind.RelativeOrAbsolute);
            image.EndInit();
            image.Freeze();
        }

        return image;
    }
}


由于您已经设置了MainWindow的DataContext,并且images已经是一个属性,因此您还应该对ItemsControl的ItemsSource属性使用数据绑定,而不是在代码隐藏中分配它。
将source属性设为公共属性,并遵循通常的命名约定:

public ObservableCollection<ImageViewModel> Images { get; }
    = new ObservableCollection<ImageViewModel>();

public MainWindow()
{
    InitializeComponent();
    DataContext = this;
}


然后在XAML中编写一个绑定:

<ItemsControl ItemsSource="{Binding Images}">
...

相关问题