Конвертер ConvertBase64ToImage из XAML в Silverlight 3

Ниже приведен класс, который преобразует строку (поступающую из базы данных сервера sql) в изображение. Как я могу вызвать функцию преобразования из элемента управления XAML Image, чтобы при открытии дочерней формы я видел изображение отдельного сотрудника в зависимости от того, какая строка была выбрана в таблице данных основных форм. По сути, у меня вопрос - могу ли я вызвать функцию конвертера, которая будет переводить текст фотографии в изображение во время выполнения ?. Я пробовал что-то вроде этого ... Раньше я использовал для этого код, но я хотел бы сделать это напрямую из XAML.

XAML: -

<Image x:Name="EmpPic"  
Source=Text="{Binding Photo, Mode=TwoWay, Converter={StaticResource PhotoConverter}" 
    HorizontalAlignment="Center"  
Width="165" 
Height="160" 
    Margin="2,2,2,2"/>

Код:-

    using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using System.Windows.Media.Imaging;
using System.Windows.Data;

namespace SL3Demo.Utility
{
    //public class PhotoConverter : IValueConverter  
    //{
    //    //public BitmapImage ConvertBase64ToImage(string base64String)
    //    //{
    //    //    //Convert Base64 String to byte[]
    //    //    byte[] imageBytes = Convert.FromBase64String(base64String);

    //    //    BitmapImage bi = new BitmapImage();
    //    //    bi.SetSource(new MemoryStream(imageBytes));

    //    //    return bi;
    //    //}
    //}

    public class PhotoConverter 
    {
        public BitmapImage PhotoConvert(string value)
        {
            byte[] imageBytes = Convert.FromBase64String(value.ToString());
            BitmapImage bi = new BitmapImage();
            bi.SetSource(new MemoryStream(imageBytes));

            return bi;
        }



    }

}

person Tor Storli    schedule 13.10.2009    source источник


Ответы (1)


Это близко, но нужно еще немного поработать. Сначала код, вам нужна реализация IValueConverter: -

public class PhotoConverter : IValueConverter
{
    private BitmapImage PhotoConvert(string value)
    {
        BitmapImage bi = null;
        if (!String.IsNullOrEmpty(value))
        {
          byte[] imageBytes = Convert.FromBase64String(value);
          bi = new BitmapImage();
          bi.SetSource(new MemoryStream(imageBytes));
        }

        return bi;
    }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return PhotoConvert((string)value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Теперь вам нужно сделать экземпляр этого конвертера доступным в Xaml, хорошим местом будет словарь ресурсов UserControls: -

<UserControl ...Usual set of xmlns here...
  xmlns:utils="clr-namespace:SL3Demo.Utility;assembly=SL3Demo">

   <UserControl.Resources>
     <utils:PhotoConverter x:Key="PhotoConverter" />
   </UserControl.Resources>

Затем позже на вашем изображении: -

<Image x:Name="EmpPic"
    Source="{Binding Photo, Converter={StaticResource PhotoConverter} }" 
    HorizontalAlignment="Center" Width="165" Height="160" Margin="2,2,2,2"/>
person AnthonyWJones    schedule 15.10.2009
comment
Я пробовал ваш код, но при сборке получаю эту ошибку: Ошибка 1 Неожиданный токен Нет в правиле: MarkupExtension :: = '{' TYPENAME (аргументы)? @ '}' в '{Binding Photo, Converter = {StaticResource PhotoConverter}'. Нужно ли мне добавлять параметры в XAML для изображения? - person Tor Storli; 15.10.2009
comment
Отсутствует} в атрибуте Source. - person AnthonyWJones; 15.10.2009