Xamarin.ios 自定义Xamarin.Forms布局

Xamarin.ios 自定义Xamarin.Forms布局,xamarin.ios,xamarin,xamarin.forms,Xamarin.ios,Xamarin,Xamarin.forms,我正在使用Xamarin表单构建一个Android和iOS应用程序 我只是想在Android应用程序上为我的ListView项目设置一个可绘制的背景。myListView项目的根视图是StackLayout的: var listView = new ListView { ItemsSource = items, ItemTemplate = new DataTemplate(() => { return new ViewCell {

我正在使用Xamarin表单构建一个Android和iOS应用程序

我只是想在Android应用程序上为我的
ListView
项目设置一个可绘制的背景。my
ListView
项目的根视图是
StackLayout
的:

var listView = new ListView
{
    ItemsSource = items,
    ItemTemplate = new DataTemplate(() =>
    {
        return new ViewCell
        {
            View = new StackLayout(...)
        };
    }
};
我知道我可以使用自定义渲染器访问本机元素:

public class MyEntryRenderer : EntryRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (e.OldElement == null) {
            var nativeEditText = (EditText)Control;
            ...
        }
    }
}
我在某个地方读到布局使用了
VisualElementRenderer
,因此我尝试了以下方法:

public class ListViewItemRenderer : VisualElementRenderer<StackLayout>
{
    protected override void OnElementChanged(ElementChangedEventArgs<StackLayout> e)
    {
        base.OnElementChanged(e);

        // any way to access the native element?
    }
}
protected override void OnElementChanged(ElementChangedEventArgs<StackLayout> e)
{
    base.OnElementChanged(e);
    SetBackgroundDrawable(Resources.GetDrawable(Resource.Drawable.listViewItem));
}
公共类ListViewItemRenderer:VisualElementRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
//有没有办法访问本机元素?
}
}
但是
VisualElementRenderer
似乎没有给我访问本机元素的权限


那么,有什么方法可以访问布局元素的本机元素吗?或者可能有一种不同的方法可以简单地在我的Android应用程序中的布局上设置一个可绘制的背景?

我知道你想连接到一个现有的布局渲染器,并扩展它以访问具有背景图像等额外功能的本机元素

最终,对背景图像的支持将得到支持,就像我想象的布局控件中的背景颜色一样。这可能值得等待,因为我不明白他们为什么不在以后的版本中实现这些

同时,你需要一些可以工作并且很容易实现的东西

因此,通过从布局继承渲染器来创建可绘制的背景可能不是最简单的解决方案,尽管它有其优点,因为您可以通过应用程序的所有布局中的额外功能轻松重用

但是,在您的ListViewItemRenderer代码中,它继承自Xamarin.Forms控件(您指定了StackLayout),并且没有指定依赖于平台的本机,控件作为布局控件的基础,布局控件必须与所使用的Xamarin.Forms平台相关控件相匹配

每个渲染器都绑定到一个本地元素布局控件与其他自定义本机控件渲染器没有什么不同

对于自定义控件,您将编写一个如下所示的渲染器(注意,我还没有指定布局渲染器,因为我还不需要这样做,我只是根据过去的经验—但是类似的规则应该适用于为布局而不是自定义控件实现渲染器):-

//System.Windows.Controls.Grid在本例中是MyControl的WindowsPhone呈现程序的根本机控件
公共类MyControlRenderer:ViewRenderer
但是,有一种更简单的方法来实现您想要做的事情:-

更简单的方法不是从堆栈布局控件继承,而是从网格作为控件的根继承

然后,您可以将图像控件添加到网格中,也可以为同一网格行和列添加堆栈布局


通过执行上述操作,您将能够在整个listview项目行中获得背景图像。

即使我仍然不知道如何访问布局的本机元素,
VisualElementRenderer
有一种在Android上设置可绘制背景的方法(这正是我所需要的)。因此,我得出以下结论:

public class ListViewItemRenderer : VisualElementRenderer<StackLayout>
{
    protected override void OnElementChanged(ElementChangedEventArgs<StackLayout> e)
    {
        base.OnElementChanged(e);

        // any way to access the native element?
    }
}
protected override void OnElementChanged(ElementChangedEventArgs<StackLayout> e)
{
    base.OnElementChanged(e);
    SetBackgroundDrawable(Resources.GetDrawable(Resource.Drawable.listViewItem));
}
protected override void OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
SetBackgroundDrawable(Resources.GetDrawable(Resource.Drawable.listViewItem));
}

谢谢您的回复。除非
VisualElementRenderer
不是布局的正确渲染器,否则我确实认为布局的渲染器不同于自定义控件渲染器。
VisualElementRenderer
没有为我提供访问本机控件的属性(控件)。Grid和StackLayout派生自Layout。我的直觉是,您需要从ViewRenderer创建派生,因为这是ViewRenderer的快捷方式,然后在此基础上应用导出,以便调用并执行自定义类实现。然后,您将能够在自己的ViewRenderer实现中添加对访问适用于每个平台的本机根控件的背景图像的额外支持。我猜想,
StackLayout
将在Android上呈现为
LinearLayout
。因此,我尝试了
公共类ListViewItemRenderer:ViewRenderer
,但
Control
保持为空。这是有意义的,但是他们将Android的基础指定为唯一视图,因为他们还允许渲染器覆盖不同的布局。我刚刚看到您管理了一个变通方法,但是如果您按照上面的建议进行操作,它确实有效,并允许您通过获得对本机元素的根访问权限进行自定义。VisualElementRenderer有一个名为
元素的属性,它返回本机元素。如何在iOS中实现同样的效果?您好,我知道这是一篇老文章。但是请你提供给我你最终使用的全部android源代码。包括listview数据模板和stacklayout渲染器。请