如何基于其中具有StackLayout的框架创建新的Xamarin元素?

时间:2018-11-22 00:10:42

标签: xamarin xamarin.forms

我有一个带有StackLayout的框架:

<Frame CornerRadius="1" HasShadow="false" Margin="10" 
 BackgroundColor="White" BorderColor="Silver" Padding="0" >
   <StackLayout Orientation="Vertical" Spacing="0" Padding="0" >
      <xaml:PtiXaml />
      <template:LineTemplate />
      <xaml:AtiXaml />
      <template:LineTemplate />
      <xaml:StiXaml />
   </StackLayout>
</Frame>

我可以创建一个名为NewFrame的新对象,该对象与其中具有StackLayout的Frame相同吗?

<template:NewFrame>
   <xaml:PtiXaml />
   <template:LineTemplate />
   <xaml:AtiXaml />
   <template:LineTemplate />
   <xaml:StiXaml />
</template:NewFrame>

<template:NewFrame>
   <xaml:ABCXaml />
</template:NewFrame>

<template:NewFrame>
   <Label Text="X" />
</template:NewFrame>

有人建议我使用“自定义视图”,但我已经查看过并且找不到包含内部其他元素的示例。

2 个答案:

答案 0 :(得分:0)

在解决方案资源管理器中的共享项目(或PCL)中的所需位置上右键单击(我建议添加一个名为“视图”或“ CustomViews”的文件夹并在该文件夹中创建该项目),选择“添加新的项目”,然后选择“内容视图”(其后没有(C#)。文件名应类似于“ View1.xaml”,您可以根据自己的喜好进行更改,但是重要的是xaml扩展名已经存在。< / p>

这将使用xaml和xaml.cs文件创建一个新的ContentView。 在xaml文件中,您可以声明上面发布的xaml代码,并将所有必要的代码写入xaml.cs文件中。

现在,您可以在要放置视图的页面上添加名称空间声明:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
        ...
        xmlns:customs="clr-namespace:YourNamespace.Views;assembly=YourNamespace"

并声明该页面或任何布局内容中的元素:

<customs:CustomViewName ... />

如果您希望能够控制元素的行为,则可以在后面的代码中添加BindableProperties。

有关这方面的更多详细信息,您可能需要看一下这篇文章:https://visualstudiomagazine.com/articles/2017/10/01/add-custom-controls.aspx

答案 1 :(得分:0)

使用ContentViewControlTemplate创建自定义控件。这样,您可以创建一个名为NewFrame的新控件,为该控件编写XAML,然后使用<ContentPresenter>内的<ControlTemplate>标记来指定内容的位置。

像这样:

.
└── NewFrame
    ├── NewFrame.cs
    └── NewFrame.xaml  -> Is a ResourceDictionary

NewFrame.cs:

namespace TestApp.Controls
{
    public partial class NewFrame : ContentView
    {
    }
}

NewFrame.xaml:

<ResourceDictionary 
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:newFrame="clr-namespace:TestApp.Controls"
    x:Class="Namespace.For.A.ResourceDictionary">


    <Style TargetType="newFrame:NewFrame">
        <Setter Property="ControlTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <ContentView BackgroundColor="Transparent">
                        <Frame CornerRadius="1" HasShadow="false" Margin="10" BackgroundColor="White" BorderColor="Silver" Padding="0" >
                            <StackLayout Orientation="Vertical" Spacing="0" Padding="0">
                                <ContentPresenter/>
                            </StackLayout>
                        </Frame>
                    </ContentView>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</ResourceDictionary>

ConsumingYourControl.xaml:

 <template:NewFrame>
    <template:NewFrame.Content>
        <xaml:PtiXaml />
        <template:LineTemplate />
        <xaml:AtiXaml />
        <template:LineTemplate />
        <xaml:StiXaml />
    </template:NewFrame.Content>
</template:NewFrame>

<template:NewFrame>
    <template:NewFrame.Content>
        <xaml:ABCXaml />
    </template:NewFrame.Content>
</template:NewFrame>

<template:NewFrame>
    <template:NewFrame.Content>
        <Label Text=""/>
    </template:NewFrame.Content>
</template:NewFrame>