Android CardView的自定义渲染器未显示Forms组件内容

时间:2016-10-06 08:06:53

标签: xamarin xamarin.android xamarin.forms

我已经创建了一个自定义组件,它扩展了ContentView和渲染器,渲染到Android上的CardView。

我面临的问题是Forms内容呈现在CardView下方。在KitKat上,这不会发生,但我认为CardView实现与Lollipop或更新版本不同。

将CardView的背景颜色设置为透明(0x00000000)会显示CardView下方的内容。

表单组件:

using Xamarin.Forms;

namespace CodeFest
{
    public class NativeClientProfile : ContentView
    {
        public NativeClientProfile()
        {
            var grid = new Grid
            {
                RowDefinitions = new RowDefinitionCollection {new RowDefinition()},
                ColumnDefinitions = new ColumnDefinitionCollection {new ColumnDefinition(), new ColumnDefinition()}
            };
            grid.Children.Add(new Label {Text = "FSP No"}, 0, 0);
            grid.Children.Add(new Label {Text = "12345", HorizontalTextAlignment = TextAlignment.Center}, 1, 0);
            grid.Children.Add(new Label {Text = "Risk"}, 0, 1);
            grid.Children.Add(
                new Label {Text = "Low", TextColor = Color.Green, HorizontalTextAlignment = TextAlignment.Center}, 1, 1);
            var item = new Label
            {
                Text = "Foo bar",
                HorizontalTextAlignment = TextAlignment.Center,
                FontSize = 30,
                FontAttributes = FontAttributes.Bold
            }; 
            Content = new StackLayout
            {
                Children =
                {
                    item,
                    new Label
                    {
                        Text = "Financial Services Provider",
                        HorizontalTextAlignment = TextAlignment.Center
                    },
                    grid
                }
            };
        }
    }
}

自定义渲染器:

using Android.Support.V7.Widget;
using Android.Text;
using Android.Views;
using CodeFest;
using CodeFest.Droid.ComponentRenderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(NativeClientProfile), typeof(NativeClientProfileRenderer))]
namespace CodeFest.Droid.ComponentRenderers
{
    class NativeClientProfileRenderer : ViewRenderer<NativeClientProfile, CardView>
    {
        protected override void OnElementChanged(ElementChangedEventArgs<NativeClientProfile> elementChangedEventArgs)
        {
            var view = new CardView(Context);
            //view.SetCardBackgroundColor(0x00000000);
            SetNativeControl(view);
        }
    }
}

我正在寻找一个如何在CardView自定义渲染器中正确呈现表单组件的示例。

1 个答案:

答案 0 :(得分:2)

您可以使用Frame作为基类而不是ContentView。这样做的好处是,您可以使用已使用FrameRenderer的现有Xamarin.Forms.Platform.Android.AppCompat CardView public class FrameRenderer : CardView, IVisualElementRenderer, AView.IOnClickListener, AView.IOnTouchListener 。 (见:FrameRenderer.cs)。

FrameRenderer声明

class NativeClientProfileRenderer : Xamarin.Forms.Platform.Android.AppCompat.FrameRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Frame> e)
    {
        base.OnElementChanged(e);
    }
}

<强>渲染

public class NativeClientProfile : Frame
{
    public NativeClientProfile()
    {
        // your stuff...
        Content = new StackLayout
        {
            Children =
            {
                item,
                new Label
                {
                    Text = "Financial Services Provider",
                    HorizontalTextAlignment = TextAlignment.Center
                },
                grid
            }
        };
    }
}

<强> NativeClientProfile

Frame

<强>讨论

如果您真的想手动执行,渲染器会显示它需要什么。使用FrameRenderer使您的代码依赖于Xamarin的实现。如果他们改变了为aa ab ac ba cc cf ff gh h4 ia 呈现的视图类型,它将破坏您的应用程序。但是如果你看一下FrameRenderer的实现,我会尽量避免从头开始创建它(简单的风险与努力评估)。