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

Jus*_*tin 8 xamarin.android xamarin 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
                }
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

自定义渲染器:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Sve*_*übe 2

您可以使用 aFrame作为基类而不是ContentView. 这样做的好处是,您可以使用现有FrameRendererXamarin.Forms.Platform.Android.AppCompat已经使用的CardView. (参见:FrameRenderer.cs)。

帧渲染器声明

public class FrameRenderer : CardView, IVisualElementRenderer, AView.IOnClickListener, AView.IOnTouchListener
Run Code Online (Sandbox Code Playgroud)

渲染器

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

本地客户端配置文件

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

讨论

如果您确实想手动执行此操作,渲染器会向您显示它需要什么。使用 FrameRenderer 会使您的代码依赖于 Xamarin 的实现。如果他们更改了呈现的视图类型,Frame则会破坏您的应用程序。但如果您查看 FrameRenderer 的实现,我会尽量避免完全从头开始创建它(简单的风险与工作量评估)。