我已经创建了一个自定义组件,它扩展了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自定义渲染器中正确呈现表单组件的示例。
答案 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的实现,我会尽量避免从头开始创建它(简单的风险与努力评估)。