我正试图加载(异步)一个图片从一个目录,将显示加载时。
在我的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));
}
}
型
因此,代码执行并执行某些操作,但不显示任何图像:
的数据
1条答案
按热度按时间lx0bsm1f1#
代码抛出
StackOverflowException
,因为Source
属性getter调用字符串
它应该看起来像下面所示。请注意,它还使用
UriKind.RelativeOrAbsolute
来支持绝对和相对图像文件路径。型
由于您已经设置了MainWindow的
DataContext
,并且images
已经是一个属性,因此您还应该对ItemsControl的ItemsSource
属性使用数据绑定,而不是在代码隐藏中分配它。将source属性设为公共属性,并遵循通常的命名约定:
型
然后在XAML中编写一个绑定:
型