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自定义渲染器中正确呈现表单组件的示例.
您可以使用 aFrame作为基类而不是ContentView. 这样做的好处是,您可以使用现有FrameRenderer的Xamarin.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 的实现,我会尽量避免完全从头开始创建它(简单的风险与工作量评估)。
| 归档时间: |
|
| 查看次数: |
516 次 |
| 最近记录: |