Xamarin.forms 使用XAML和自定义呈现程序形成UserControl

Xamarin.forms 使用XAML和自定义呈现程序形成UserControl,xamarin.forms,Xamarin.forms,已经有一些很好的例子说明了如何通过- 从视图或现有内置控件派生类,然后根据平台为其创建自定义呈现器 我想创建一个“复合自定义控件或usercontrol”,它包含在XAML中定义的多个元素(在共享代码中),然后使用渲染器进行自定义(也就是说调整每个平台的样式) 有没有人有这样做的例子?一个带有可绑定标签和输入框的视图的简单示例应该足以显示主要原理 这是我到目前为止所拥有的- 定义了一个ContentView来表示我们的usercontrols布局和内容 暗藏- public分部类Vi

已经有一些很好的例子说明了如何通过-

  • 从视图或现有内置控件派生类,然后根据平台为其创建自定义呈现器
我想创建一个“复合自定义控件或usercontrol”,它包含在XAML中定义的多个元素(在共享代码中),然后使用渲染器进行自定义(也就是说调整每个平台的样式)

有没有人有这样做的例子?一个带有可绑定标签和输入框的视图的简单示例应该足以显示主要原理

这是我到目前为止所拥有的-

定义了一个ContentView来表示我们的usercontrols布局和内容


暗藏-

public分部类VisualNewsContentView:ContentView
{
公共VisualNewsContentView()
{
初始化组件();
}
//不确定我是否需要这个来访问条目。。。
公共条目GetEntry()
{
返回髓鞘;
}
}
为该ContentView添加Android自定义渲染器,如何访问和自定义ContentView的本机部分/控件

[程序集:ExportRenderer(typeof(VisualNewsContentView)、typeof(VisualNewsRenderer))]
名称空间News.Forms.Android
{
公共类VisualNewsRenderer:ViewRenderer
{
公共VisualNewsRenderer(){}
模型更改时受保护的覆盖无效(VisualElement oldModel、VisualElement newModel)
{
base.OnModelChanged(旧模型、新模型);
if(newModel!=null){
VisualNewContentView NewContentView=作为VisualNewContentView的新模型;
//例如,如何获得EditText等,以便本机自定义其外观?当使用EntryRenderer之类的内置渲染器时,可以使用Control访问本机控件。
Console.WriteLine(newcontentview.GetLabel().Text);
EditText ed=(EditText)newsContentView.GetEntry()。???
}
}
}
}
只是不能很好地将各个部分组合起来工作,ContentView似乎在页面上呈现良好,但无法确定如何在viewrenderer中访问其子本机控件

还可以展示如何对标签和条目文本值使用绑定


我不想为usercontrol的每个标签/条目等定义自定义呈现程序。

这就是您的意思吗

访问Xamarin.Forms控件的某些属性:

public分部类VisualNewsContentView:ContentView
{
public VisualNewsContentView()
{
初始化组件();
}
公共标签
{
得到
{
返回MyLabel;
}
设置
{
MyLabel=值;
}
}
公开入场
{
得到
{
返回髓鞘;
}
设置
{
MyEntry=价值;
}
}
}
渲染器中的一些魔法可以自定义页面上的控件:

[程序集:ExportRenderer(typeof(VisualNewsContentView)、typeof(VisualNewsRenderer))]
名称空间News.Forms.Android
{
公共类VisualNewsRenderer:ViewRenderer
{
公共VisualNewsRenderer(){}
模型更改时受保护的覆盖无效(VisualElement oldModel、VisualElement newModel)
{
base.OnModelChanged(旧模型、新模型);
if(newModel!=null){
VisualNewContentView NewContentView=作为VisualNewContentView的新模型;
newcontentview.Label.Text=“这是某种..”;
newscontview.Entry.Text=“MAGIC!”;
newsContentView.Entry.BackgroundColor=Color.Blue;
newsContentView.Entry.RotationX=180;
newscontview.Entry.Focus();
}
}
}
}
编辑:

我不知道是否可以将您的控件从XAML页面映射到本机控件。您可以在渲染器中添加要本机自定义的控件

[程序集:ExportRenderer(typeof(VisualNewsContentView)、typeof(VisualNewsRenderer))]
名称空间News.Forms.Android
{
公共类VisualNewsRenderer:NativeRenderer
{
公共VisualNewsRenderer(){}
模型更改时受保护的覆盖无效(VisualElement oldModel、VisualElement newModel)
{
base.OnModelChanged(旧模型、新模型);
if(newModel!=null){
LinearLayout布局=新的LinearLayout(Application.Context);
布局。方向=方向。垂直;
TextView tv=新的TextView(Application.Context);
tv.Ellipsize=TextUtils.TruncateAt.Middle;
tv.Text=“这是某种……”;
EditText et=新的EditText(Application.Context);
et.SetTextColor(图形、颜色、巧克力);
et.Text=“魔术!”;
layout.AddView(电视);
layout.AddView(et);
SetNativeControl(布局);
}
}
}
}

但是像这样,您将不会使用ContentView。。很抱歉,我没有比这更好的了。

我自定义复合用户控件的解决方案是为复合用户控件中使用的每个控件创建一个自定义控件。 例如,此控件中的哪个控件:


我会这样做:


CustomControls:StackLayout的示例类为:

(在StackLayout.cs中)