使用xaml在自定义视图中嵌套元素

时间:2017-12-05 10:00:01

标签: c# xaml xamarin xamarin.forms

我有自定义StackLayout

public partial class CustomView : StackLayout
{
    public CustomView()
    {
        InitializeComponent();
    }
}

和Xaml

<?xml version="1.0" encoding="UTF-8"?>
<StackLayout xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="XamlSample.CustomView"
    Orientation="Vertical"
    VerticalOptions="FillAndExpand">
    <StackLayout x:Name="FirstContainer"
        Orientation="Horizontal"
        HeightRequest="40"
        Spacing="0">
    </StackLayout>
    <StackLayout x:Name="SecondContainer"
        BackgroundColor="Red">
    </StackLayout>
</StackLayout>

这个想法是在xaml中使用这个布局,像这样的子元素

<custom:CustomView>
        <StackLayout x:Name="FirstChild"
            VerticalOptions="FillAndExpand"
            BackgroundColor="Transparent">
        </StackLayout>
        <StackLayout x:Name="SecondChild"
            VerticalOptions="FillAndExpand"
            BackgroundColor="Green">
        </StackLayout>
    </custom:CustomView>

但我需要的主要事情是FirstChild应该是FirstContainer的孩子,而SecondChild应该是SecondContainer的孩子。这样我就可以在CustomView中处理子元素的位置并使用xaml。 我知道如何使用它背后的代码制作我想要的东西非常简单,但在这种情况下,我需要将大量的xaml元素迁移到后面的代码中。

1 个答案:

答案 0 :(得分:2)

你可以试试这个:

的Xaml

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MonRdvEnLigne.Common.Views.Xaml.CustomStackLayout">
  <ContentView.Content>
      <StackLayout>
          <StackLayout x:Name="FirstChild"
                       VerticalOptions="FillAndExpand"
                       BackgroundColor="Transparent">
          </StackLayout>
          <StackLayout x:Name="SecondChild"
                       VerticalOptions="FillAndExpand"
                       BackgroundColor="Green">
          </StackLayout>
        </StackLayout>
  </ContentView.Content>
</ContentView>

并且

[ContentProperty("Elements")]
public partial class CustomStackLayout : ContentView
{
    public CustomStackLayout()
    {
        InitializeComponent();
    }

    public IEnumerable<View> Elements { get; set; }
}