0

我有一个CarouselView带有标签的DataTemplate. 每次CarouselView更改内部显示的元素时,位于外部的 Image 控件的 ImageSource 属性CarouselView都会更新

从列表中CarouselView获取内容

List<FraseClass> ListaFrasi = new List<FraseClass>

public class FraseClass : ViewModelBase
{
     private ImageSource _ImgSource;

     public ImageSource ImgSource
     {
         get { return _ImgSource; }
         set
         {
            _ImgSource = value;
            RaisePropertyChanged("ImgSource");
         }
     }
}

public class ViewModelBase : INotifyPropertyChanged
{    
    public event PropertyChangedEventHandler PropertyChanged;
        
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
     }
}

XAML

<ff:CachedImage  x:Name="ImgFrase" Scale="2" FadeAnimationEnabled="True" DownsampleToViewSize="True" />

C#:

private void CurrentItemChanged (object sender, CurrentItemChangedItemArgs e)
{
    if (ListaFrasi[Index].ImgSource == null)
    {
         string LinkImg = "ftp://epiz_27426656@ftpupload.net/htdocs/ImgSfondo/" + DateTime.Now.AddDays(-Index).DayOfYear + ".jpg";
         byte[] ImgByte = WebLcient.DownloadData(LinkImg);
         MemoryStream mStream = new MemoryStream(ImgByte);
         ListaFrasi[Index].ImgSource = ImageSource.FromStream(() => mStream);
         ImgFrase.Source= ImageSource.FromStream(() => mStream);
    }
     else
    {
         ImgFrase.Source = ListaFrasi[Index].ImgSource;
    }
}

如果列表中的对象在属性中没有值,请下载图像并且代码可以正常工作,如果该对象在属性中已经有数据,我尝试显示图像,但实际上相同的图像继续被显示

4

1 回答 1

0

您正在使用List<FraseClass>来缓存图片,而 ImgFrase 引用不同的图片取决于List<FraseClass>. 但是你发现当你改变里面的Label时图片不会改变CarouselView。那正确吗?

您对代码的描述完美无缺,并且继续显示相同的图像不够清晰。但是,您仍然可以专注于:

  1. 是否ListaFrasi缓存了正确的图片。
  2. 当您更改 CarouselView.

我对这段代码有点困惑:

ImgFrase.Source= ImageSource.FromStream(() => mStream);

你为什么不直接拿这个?

if (ListaFrasi[Index].ImgSource == null)
{
     string LinkImg = "ftp://epiz_27426656@ftpupload.net/htdocs/ImgSfondo/" + DateTime.Now.AddDays(-Index).DayOfYear + ".jpg";
     byte[] ImgByte = WebLcient.DownloadData(LinkImg);
     MemoryStream mStream = new MemoryStream(ImgByte);
     ListaFrasi[Index].ImgSource = ImageSource.FromStream(() => mStream);
}

ImgFrase.Source = ListaFrasi[Index].ImgSource;

如果我是对的,内存流不能被使用两次。

如果还是不能解决问题,能否提供完整的代码?

于 2021-05-11T07:32:26.017 回答