在Xamarin Forms中,将Base64字符串绑定到ListView。

4
首先,我是Xamarin.Form的新手。我正在尽力从Google中获取最佳信息,但有些功能即使搜索了很多次也无法获得。
我正在创建一个Xamarin.Form应用程序。在该应用程序中,我将图像以base64字符串格式存储在sql server中,我的数据类型在sql server中是varchar(Max)。
我的问题是,如何将base64字符串转换为图像,并将图像绑定到列表视图。
Listview的代码:
<ListView x:Name="listView" HasUnevenRows="true" SeparatorColor="Gray">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Image Source="{Binding image}"  Grid.Row="0" 
                        Grid.RowSpan="3" Grid.Column="0" 
                        HorizontalOptions="Center" HeightRequest="50" 
                        VerticalOptions="Center">
                    <Image.GestureRecognizers>
                        <TapGestureRecognizer Tapped="OnImageTapped" />
                    </Image.GestureRecognizers>
                </Image>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

c#代码:

Public async Task loadDeveloperList()
{
    try
    {            
        List<employee> employeeDetail = new List<employee>();

        HttpClient client = new HttpClient();
        StringBuilder sb = new StringBuilder();
        client.MaxResponseContentBufferSize = 256000;
        var RestUrl = "http://example.com/Getemployee/";
        var uri = new Uri(RestUrl);
        actIndicator.IsVisible = true;
        actIndicator.IsRunning = true;
        var response = await client.GetAsync(uri);

        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();

            List<employee> onjEmployee = JsonConvert.DeserializeObject<List<employee>>(content);

            foreach (var item in onjEmployee)
            {
                employee emptemp = new employee()
                {
                    empID = item.empID,
                    name = item.name,
                    city = item.city,
                    post = item.post,
                    salary = item.salary,
                    gender = item.gender,
                    image = item.image                            
                };
                string cFotoBase64 = emptemp.image;
                byte[] ImageFotoBase64 = System.Convert.FromBase64String(cFotoBase64);

                employeeDetail.Add(emptemp);                                         
            }
            listView.ItemsSource = employeeDetail;
        }
    }
    catch (Exception ex)
    {

    }          
}

请有人给我提供一个想法和解决方案。


将你的员工类放在你的帖子中。 - Krunal Mevada
1个回答

6
根据这个论坛帖子,您可以为其创建一个转换器。 只需将Base64字符串保留为您的Employee的一部分,即在Base64Image属性中。
现在像这样定义一个转换器。
public class ConverterBase64ImageSource : IValueConverter
{
    public object Convert (object value, Type targetType, object parameter, CultureInfo culture)
    {
        string base64Image = (string)value;

        if (base64Image == null)
            return null;

        // Convert base64Image from string to byte-array
        var imageBytes = System.Convert.FromBase64String(base64Image);

        // Return a new ImageSource
        return ImageSource.FromStream (() => {return new MemoryStream(imageBytes);});
    }

    public object ConvertBack (object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Not implemented as we do not convert back
        throw new NotSupportedException();
    }
}

现在在你的XAML中声明并使用转换器,如下所示:
将命名空间添加到页面根元素中,假设它是一个普通的ContentPage,应该如下所示:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YourApp;assembly=YourApp"
             x:Class="YourApp.YourPage">

请注意:YourAppYourPage等应替换为您实际的应用程序名称和正确的命名空间。

现在将转换器声明为页面的一部分。

<ContentPage.Resources>
   <ResourceDictionary>
      <local:ConverterBase64ImageSource x:Key="Base64ToImageConverter" />
   </ResourceDictionary>
</ContentPage.Resources>

最后在 Image 上使用转换器。
<ListView x:Name="listView" HasUnevenRows="true" SeparatorColor="Gray">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Image Source="{Binding Base64Image, Converter={StaticResource Base64ToImageConverter}}}"  Grid.Row="0" 
                        Grid.RowSpan="3" Grid.Column="0" 
                        HorizontalOptions="Center" HeightRequest="50" 
                        VerticalOptions="Center">
                    <Image.GestureRecognizers>
                        <TapGestureRecognizer Tapped="OnImageTapped" />
                    </Image.GestureRecognizers>
                </Image>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

您的图片现在应该已经显示了!


我可以问一下在Xamarin Forms中如何对图像进行编码和解码吗?谢谢。 - Eng Soon Cheah
@Cheah 转换 from 的代码已经在上面的代码中了。转换成 Base64 的代码只是 System.Convert.ToBase64String() - Gerald Versluis
我对上述解决方案有问题。如果我将Converter的定义包含在我的XAML代码中,即使我从未实际使用转换器,应用程序也会挂起。仅仅是定义本身似乎就是问题所在。我已经在root ContentPage之后添加了定义。我没有收到任何错误消息,只是“我的安卓手机上的应用程序未响应”。如果我删除定义,应用程序就不会挂起。 - Denis Vitez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接