C# WP8 LongListSelector中的自动高度图像

C# WP8 LongListSelector中的自动高度图像,c#,xaml,windows-phone-8,C#,Xaml,Windows Phone 8,我在WindowsPhone8上使用LongListSelector在XAML和C#中创建一个无限滚动提要。要显示的项目从web提要加载并使用数据绑定显示,每个项目的一个字段是一个图像,该图像也是从web加载的 图像的大小都不同,但我没有在图像控件上设置宽度或高度,只是Margin=“10”使其填充屏幕的宽度,并且是图像的正确高度 DataTemplate中的图像控件如下所示: <Image Source="{Binding Source.ImageUrl}" Margin="10" St

我在WindowsPhone8上使用LongListSelector在XAML和C#中创建一个无限滚动提要。要显示的项目从web提要加载并使用数据绑定显示,每个项目的一个字段是一个图像,该图像也是从web加载的

图像的大小都不同,但我没有在图像控件上设置宽度或高度,只是
Margin=“10”
使其填充屏幕的宽度,并且是图像的正确高度

DataTemplate中的图像控件如下所示:

<Image Source="{Binding Source.ImageUrl}" Margin="10" Stretch="UniformToFill" />

然而,我得到了一个
System.Windows.layoutCycleeException
,它说:“检测到布局周期。布局无法完成。”

这似乎是因为
控件在图像下载之前就被放入了LongListSelector。然后,图像下载后,
控件会调整大小,从而导致错误。如果我在
控件上设置
Height=“300”
,则不会出现异常

我仍然希望在下载图像之前显示feed,并且feed中可能有很多图像,因此它需要高效地使用内存


这个问题有什么解决办法吗?

应该使用Uniform来填充宽度,而不是UniformToFill(因为UniformToFill将尝试填充“高度”,并且由于没有定义高度,我可以看到它在回收物品时会导致问题)

也许您可以尝试限制同时加载的图像数量,例如,下面的代码将使用atached属性一次加载一个图像(您可以适应加载多个图像)。对于AsyncLock,您可以使用(或在线搜索)中的代码

公共静态只读从属属性LimitedImageProperty= DependencyProperty.RegisterAttached(“LimiteImage”、typeof(字符串)、typeof(LimitImageDownloadConverter)、新PropertyMetadata(默认值(字符串)、LimiteImagedChanged))

publicstaticvoidsetlimitedimage(UIElement元素,字符串值)
{
元素.SetValue(LimitedImageProperty,value);
}
公共静态字符串GetLimiteImage(UIElement)
{
return(string)元素.GetValue(LimitedImageProperty);
}
AsyncLock imageLock=新的AsyncLock();
私有静态异步void LimitedImagedChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
图像currentImage=d作为图像;
对象dataContext=currentImage.dataContext;
字符串uri=e.NewValue作为字符串;
if(string.IsNullOrEmpty(uri))
{
返回;
}
使用(Wait imageLock.AcquireLock())
{
if(currentImage.DataContext!=DataContext)
{
//项目J已回收
返回;
}
等待加载映像(currentImage,uri);
}
}
私有静态任务LoadImage(图像图像,字符串uri)
{
TaskCompletionSource tcs=新的TaskCompletionSource();
BitmapImage位图=新BitmapImage(新Uri(Uri));
bitmap.ImageOpened+=(发送,参数)=>
{
tcs.SetResult(真);
};
bitmap.ImageFailed+=(发送,参数)=>
{
tcs.SetResult(假);
};
返回tcs.Task;
}

然后只需使用
local:myAttachedProperty.LimitedImage
在图像上设置图像源,而不是直接使用图像源。

我想这更有意义,但将其设置为
Uniform
仍然会产生相同的异常。也有这个问题!默认设置width属性解决了这个问题,但我也想知道如何使用未定义的图像!
    public static void SetLimitedImage(UIElement element, string value)
    {
        element.SetValue(LimitedImageProperty, value);
    }

    public static string GetLimitedImage(UIElement element)
    {
        return (string) element.GetValue(LimitedImageProperty);
    }


    AsyncLock imageLock = new AsyncLock();

    private static async void LimitedImagedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Image currentImage = d as Image;
        object dataContext = currentImage.DataContext;
        string uri = e.NewValue as string;
        if (string.IsNullOrEmpty(uri))
        {
            return;
        }

            using (await imageLock.AcquireLock())
            {
                if (currentImage.DataContext != dataContext)
                {
                    //Item jhave been recycled
                    return;
                }
                await LoadImage(currentImage, uri);
            }
    }




    private static Task<bool> LoadImage(Image image, string uri)
    {
        TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
        BitmapImage bitmap = new BitmapImage(new Uri(uri));
        bitmap.ImageOpened += (send, arg) =>
        {

            tcs.SetResult(true);
        };
        bitmap.ImageFailed += (send, arg) =>
        {

            tcs.SetResult(false);
        };
        return tcs.Task;
    }