Xamarin表单Android - 从DataTemplate创建自定义ListView分隔符(将DataTemplate转换为Drawable)

时间:2016-06-29 06:31:58

标签: listview xamarin.android xamarin.forms datatemplate divider

我正在为Android ListView实现渲染器,我想控制分隔符外观。因此,我创建了一个DataTemplate。

问题是e.NewElement.SeperatorTemplate.CreateContent()返回查看对象。

listView.Divider接受可绘制对象。

我需要将转换效率提高,因此将其保存为图像是不可能的。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

使用视图的绘图缓存找到解决方案:

            //Convert Android view into Drawable

            view.DrawingCacheEnabled = true;
            view.Layout(0, 0, (int)Math.Round(request.Request.Width * Density), (int)Math.Round(request.Request.Height * Density));                  
            view.BuildDrawingCache(true);
            var bitmap = Bitmap.CreateBitmap(view.GetDrawingCache(true));
            view.DrawingCacheEnabled = false;
            Drawable drawable = new BitmapDrawable(bitmap);

完整代码:

            //Get Xamarin forms view from DataTemplate
            Xamarin.Forms.View divider = (Xamarin.Forms.View)(e.NewElement.SeperatorTemplate?.CreateContent());
            if (divider != null)
            {
                //get renderer
                var dividerRenderer = Platform.CreateRenderer(divider);

                //Measuring the element
                SizeRequest request = dividerRenderer.Element.Measure(double.PositiveInfinity, double.PositiveInfinity);

                //Measuring element Chilren
                Xamarin.Forms.Layout.LayoutChildIntoBoundingRegion(dividerRenderer.Element, new Rectangle(0.0, 0.0, request.Request.Width, request.Request.Height));

                ViewGroup view = dividerRenderer.ViewGroup; 

                //Convert Android view into Drawable
                view.DrawingCacheEnabled = true;
                view.Layout(0, 0, (int)Math.Round(request.Request.Width * Density), (int)Math.Round(request.Request.Height * Density));    
                view.BuildDrawingCache(true);
                var bitmap = Bitmap.CreateBitmap(view.GetDrawingCache(true));
                view.DrawingCacheEnabled = false;

                //Set divider Drawable divider to native list divider
                listView.Divider = new BitmapDrawable(bitmap);
                listView.DividerHeight = (int)Math.Round(request.Request.Height * Density);
            }