WP8.1 C#绑定联系人图像

时间:2014-12-07 06:26:09

标签: c# xaml binding windows-phone-8.1 contacts

信息
很简单,我正在尝试创建一个可以显示用户联系人的应用程序。

我也是一名自学成才的程序员,所以我在某些方面有编程经验,但我对数据绑定一般都比较新。

首先,我有一个ListView控件,其中包含图像绑定。

<ListView x:Name="ContactsView" ItemsSource="{Binding}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image x:Name="ContactImage" Source="{Binding Converter={StaticResource ContactPictureConverter}, Mode=OneWay}" Height="100" Width="100" Margin="0,0,0,0"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

我还有一个转换器,它获取Contact Image的IRandomAccessStream并将其作为BitmapImage返回。如果未找到图像(null异常),则转换器将返回联系人的默认图片。

public class ContactPictureConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string culture)
    {
        Contact c = value as Contact;

        try
        {
            return GetImage(c).Result;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
        return @"Images/default.jpg";
    }

    async Task<BitmapImage> GetImage(Contact con)
    {
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.DecodePixelHeight = 100;
        bitmapImage.DecodePixelWidth = 100;
        using (IRandomAccessStream fileStream = await con.Thumbnail.OpenReadAsync())
        {
            await bitmapImage.SetSourceAsync(fileStream);
        }
        return bitmapImage;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string culture)
    {
        throw new NotImplementedException();
    }
}

其他信息
该应用程序设置为Windows Phone 8.1 WinRT 为了获得联系人,我使用了ContactStore。

IReadOnlyList<Contact> contacts; //Global Declaration

ContactStore store = await ContactManager.RequestStoreAsync();
contacts = await store.FindContactsAsync();
ContactsView.ItemsSource = contacts;

问题
每个联系人都返回默认的联系人图像(意味着在尝试获取联系人图像时发生了一些异常)。这不应该发生,因为我的大多数联系人都有与之关联的图像。

问题
我应该如何获取联系人的图像并将其绑定到ListView for Windows Phone 8.1中的图像控件?

4 个答案:

答案 0 :(得分:1)

感谢Romasz和Murven,我能够为我的问题找到解决方案。

XAML:

<ListView x:Name="ContactsView" Grid.Row="1" Background="White" ItemsSource="{Binding}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Image x:Name="ContactImage" DataContext="{Binding Converter={StaticResource ContactPictureConverter}}" Source="{Binding Result}" Height="100" Width="100" Margin="0,0,0,0"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

转换器:

using Nito.AsyncEx;

public class ContactPictureConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        try
        {
            Contact c = value as Contact;
            return NotifyTaskCompletion.Create<BitmapImage>(GetImage(c));
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            return null;
        }
    }

    private async Task<BitmapImage> GetImage(Contact con)
    {
        using (var stream = await con.Thumbnail.OpenReadAsync())
        {
            BitmapImage image = new BitmapImage();
            image.DecodePixelHeight = 100;
            image.DecodePixelWidth = 100;

            image.SetSource(stream);
            return image;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, string culture)
    {
        throw new NotImplementedException();
    }
}

软件包:
来自Nuget的Nito.AsyncEx

答案 1 :(得分:1)

new_log = [{'email': item[0], 'actions': item[1]} for item in sql_result]  

答案 2 :(得分:0)

问题是GetImage方法是异步的,所以你需要等待结果完成:

        Task<BitmapImage> getImageTask = GetImage(c);
        getImageTask.RunSynchronously();
        return getImageTask.Result;

答案 3 :(得分:-1)

你可以做一件事......

您可以从联系人类中检索所有图像,并将它们存储在数组或堆栈或BitmapImages列表中。(***我认为列表是更好的选择)

Contact c = value as Contact; foreach(var p in c) { q.Add(p.Thumbnail); }

此处qlist of bitmapmages