如何创建用作元素包装的XAML模板?

时间:2018-11-21 16:48:47

标签: xamarin xamarin.forms

我有以下XAML代码:

<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>

有人对我如何用类似的东西代替它有任何想法吗?

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

如您所见,我熟悉如何创建和使用包含元素的模板,但是我不知道如何创建可用作元素包装的模板。

2 个答案:

答案 0 :(得分:1)

一种方法是@Tom所说的,另一种是使用Control template,这基本上就是我想要的。

即使医生说得很坚强

  

Xamarin.Forms控件模板提供了在运行时轻松地为应用程序页面设置主题和重新主题的功能。本文提供了控件模板的介绍

您可以在ContentView中将控制模板用作包装器(我已经做完了,并且效果很好)。

在您的情况下,您必须执行ContentView并用包装器的布局填充ContentView.ControlTemplate

<ContentView
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:... your namespaces
    x:Class="YourNamespace.NewFrame">
    <ContentView.ControlTemplate>
        <ControlTemplate>
            <Frame CornerRadius="1" HasShadow="false" Margin="10" 
                BackgroundColor="White" BorderColor="Silver" Padding="0" >
                <ContentPresenter />
            </Frame>
        </ControlTemplate>
    </ContentView.ControlTemplate>
</ContentView>

如您所见,有一个ContentPresenter将会被您的内容替换(要考虑的一件事是ContentPresenter仅允许一个孩子,因此您必须将您的StackLayout放在里面)

<template:NewFrame>
    <StackLayout Orientation="Vertical" Spacing="0" Padding="0" >
        <xaml:PtiXaml />
        <template:LineTemplate />
        <xaml:AtiXaml />
        <template:LineTemplate />
        <xaml:StiXaml />
    </StackLayout>
</template:NewFrame>

另一种方法是做一个custom layout,但是它更复杂,我不会去做那种布局包装器。

答案 1 :(得分:0)

C#:

public class CustomFrame : Frame
{
    public CustomEditor()
    {
        CornerRadius = 1;
        HasShadow = false;
        Margin = 10;
        BackgroundColor = Color.White;
        BorderColor = Color.Silver;
        Padding = 0;
    }
}

用法:

<template:CustomFrame>
    <StackLayout 
        Orientation="Vertical" 
        Spacing="0" 
        Padding="0" >

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

    </StackLayout>
</template:CustomFrame>