使用自定义渲染器在Xamarin.Forms中的CollectionView

时间:2016-02-19 11:23:24

标签: c# xaml xamarin.ios xamarin.forms

我有Xaml表单,我可以从中呈现集合视图

XAML

    <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:CustomRenderer_POC;assembly=CustomRenderer_POC" 
             x:Class="CustomRenderer_POC.GalleryPage">
  <Label Text="{Binding MainText}" VerticalOptions="Center" HorizontalOptions="Center" />
  <local:CollectionView/>
</ContentPage>

CollectionView.CS

using Xamarin.Forms;
namespace CustomRenderer_POC
{
    public class CollectionView : ContentView
    {

    }
}

CollectionViewRender.cs(在iOS项目中)

using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using UIKit;
using CustomRenderer_POC;
using CoreGraphics;

[assembly: ExportRenderer(typeof(CollectionView), typeof(CollectionViewRenderer))]
namespace CustomRenderer_POC
{
    class CollectionViewRenderer : ViewRenderer<CollectionView, UICollectionView>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<CollectionView> e)
        {
            var layout = new UICollectionViewFlowLayout();
            base.OnElementChanged(e);
            if (Control == null)
            SetNativeControl(new UICollectionView(new CGRect(0, 0, 300, 256), new UICollectionViewLayout()));
            if (Control != null)
            {
                int[] a = new int[] {10, 11, 12, 13, 14};
                Control.Source = new CollectionViewSource(a);
                Control.BackgroundColor = UIColor.Blue;
                Control.ReloadData();
            }

        }
    }
}

CollectionViewSource.cs

using System;
using System.Collections.Generic;
using System.Text;
using Foundation;
using UIKit;
using System.Drawing;
using System.Linq;
using CoreGraphics;
using CustomRenderer_POC;
using Xamarin.Forms;

[assembly: ExportRenderer(typeof(UICollectionViewSource), typeof(CollectionViewSource))]
namespace CustomRenderer_POC
{
    class CollectionViewSource : UICollectionViewSource
    {
        public Array items = null;
        public CollectionViewSource(Array elements)
        {
            items = elements;
        }
        public override void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)
        {

        }

        public override UICollectionViewCell GetCell(UICollectionView collectionView, NSIndexPath indexPath)
        {
            UICollectionViewCell cell = (UICollectionViewCell)collectionView.DequeueReusableCell("MyCell", indexPath);
            cell.BackgroundColor = UIColor.Red;
            UILabel li = new UILabel(new CGRect(0, 0, 10, 20));
            li.Text = "xyz";
            cell.AddSubview(li);
            return cell;
        }
        public override nint NumberOfSections(UICollectionView collectionView)
        {
            return 1;
        }
        public override nint GetItemsCount(UICollectionView collectionView, nint section)
        {
            return items.Length;
        }
    }

}

现在重点是,

我在所有方法中都添加了一个断点。

但是,方法 GetCell ItemSelected 永远不会被点击。

任何人都可以帮忙......

我关注了很多博客,但没有任何帮助

我对“ xamarin ”平台

有所了解

我得到的最终输出是:Output of above program in iOS simulator

1 个答案:

答案 0 :(得分:0)

如你所说,它不会产生蓝屏。 继承自ContentView

的第一个问题
public class CollectionView : ContentView

不要将ContentView用于“空”视图,其中是渲染器中的主要逻辑。需要设置Content属性。或者将跳过此控件的渲染。尝试从CollectionView类继承View

其次,我更改了渲染器:

    if (Control == null) {
        SetNativeControl (new UICollectionView (new CGRect (0, 0, 300, 256), new UICollectionViewFlowLayout ()));
        Control.RegisterClassForCell(typeof(UICollectionViewCell), "MyCell");
    }

我将您的UICollectionViewLayout更改为UICollectionViewFlowLayout。 根据Apple文档,它是一个抽象的基类:

  

UICollectionViewLayout类是您的抽象基类   子类,用于生成集合视图的布局信息。

但Apple为我们提供了使用实施的准备 - UICollectionViewFlowLayout

希望这有帮助