MVVMCross Xamarin使用转换器绑定到位图

时间:2014-03-18 17:09:58

标签: c# android bitmap xamarin mvvmcross

我有一个工作的BindableViewPager(感谢Cheesebaron!),并且在viewpager控件中我为每个分页项目都有一个位图。我的viewpager视图模型包括

    private double _bearing;
    public double Bearing
    {
        get { return _bearing; }
        set
        {
            _bearing = value;
            RaisePropertyChanged(() => Bearing);
        }
    }

目的是动态地创建位图,使其成为反映轴承角度的图像。所以我使用值转换器将ImageView绑定到轴承:

<ImageView
    ...
    local:MvxBind="Bitmap Bearing, Converter=BearingToImage" />



public class BearingToImageConverter : MvxValueConverter<double, byte[]>
{

    protected override byte[] Convert(double value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {

        Bitmap bmp = BitmapFactory.DecodeResource(Application.Context.ApplicationContext.Resources, Resource.Drawable.direction_pointer_black_bg);
        byte[] bitmapData;
        using (var stream = new MemoryStream())
        {
            bmp.Compress(Bitmap.CompressFormat.Png, 100, stream);
            bitmapData = stream.ToArray();
        }

        return bitmapData;
    }
}

有几行代码使用矩阵进行旋转,为清楚起见我省略了,因为代码在没有它的情况下也无法工作。

运行代码时,会调用转换器,但我收到警告:

MvxBind:Warning: 54.71 Value was not be a valid Bitmap

并且没有显示图像。看看PictureTaking示例,我看到绑定是使用InMemoryImage转换器直接对字节数组进行的。尝试以我的方式绑定是否有效,如果我需要使用自己的转换器,我是否需要做更多来模拟InMemoryImage转换?

已解决 ,并为回答我自己的问题而道歉,但为了将来的参考:

问题似乎是缺少InMemoryImage转换器。我现在返回一个对象,而不是让我的转换器返回一个byte [],这就是位图本身。

所以转换器签名变为:

public class BearingToImageConverter : MvxValueConverter<double, object> { ...

protected override object Convert(double value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { ////

返回的对象是位图。

1 个答案:

答案 0 :(得分:0)

据我所知,你可以将字节数组绑定到ImageView但不能加倍,这就是你有这个警告的原因。我猜这就是你的自定义值转换器根本没有调用的原因。