自定义Xamarin.Forms布局

时间:2014-08-12 11:58:57

标签: xamarin.ios xamarin xamarin.forms

我正在使用Xamarin Forms构建Android和iOS应用。

我只想尝试做的是在我的Android应用中为我的ListView项设置背景。我的ListView项的根视图是StackLayout' s:

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;
            ...
        }
    }
}

但我不确定这对StackLayout(或其他任何布局)的效果如何。

我首先扩展了StackLayout

public class ListViewItem : StackLayout
{
}

我在某处看到布局使用VisualElementRenderer,所以我尝试了以下内容:

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

        // any way to access the native element?
    }
}

但是VisualElementRenderer似乎没有让我访问本机元素。

那么有什么办法可以访问Layout元素的原生元素吗?或者也许有一种不同的方法可以在我的Android应用程序中简单地设置布局背景可用吗?

2 个答案:

答案 0 :(得分:3)

即使我还不知道如何访问布局的原生元素,VisualElementRenderer也有一种在Android上设置背景可绘制的方法(这正是我需要的)。所以我最终得到了以下内容:

protected override void OnElementChanged(ElementChangedEventArgs<StackLayout> e)
{
    base.OnElementChanged(e);
    SetBackgroundDrawable(Resources.GetDrawable(Resource.Drawable.listViewItem));
}

答案 1 :(得分:0)

我知道你想要挂钩现有的布局渲染器并扩展它以访问具有背景图像等额外功能的原生元素。

最终支持 background-image 就像 background-color 一样,我想,在布局控件上。在等待这一点时可能是值得的,因为我无法理解为什么他们不会在以后的版本中实现这些。

与此同时,您需要一些可行且易于实施的东西?

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

ListViewItemRenderer 的代码中,它继承自 Xamarin.Forms 控件(您指定 StackLayout )并且未指定原生的,依赖于平台的控件,作为布局控件的基础,必须匹配使用的Xamarin.Forms平台相关控件。

每个渲染器都绑定到原生元素。 布局控件与其他自定义本机控件渲染器没有区别。

对于自定义控件,您将编写一个类似于以下内容的渲染器(请注意,我还没有指定 layout 渲染器,因为我还没有必要这样做我只是从过去的经验出发 - 但类似的规则应该适用于为布局而不是自定义控件实现渲染器: -

// System.Windows.Controls.Grid in this case is the root native control for a WindowsPhone renderer of MyControl
public class MyControlRenderer : ViewRenderer<MyControlView, System.Windows.Controls.Grid>

有一种更简单的方法,但要达到你想要的目的: -

更简单的方法不是继承 Stack Layout 控件,而是从 Grid 继承作为控件的根目录。

然后,您可以为网格添加图像控件,并为同一网格添加堆栈布局

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