复杂 Xamarin Forms 自定义控件中的内容

Bob*_*ers 3 c# xaml xamarin.forms

我正在通过派生创建自定义控件ContentView。我的目标是让用户使用该类,就像您期望使用单个内容的任何控件一样:

<local:NewControl>
  <Image source="..." />
</local:NewControl>
Run Code Online (Sandbox Code Playgroud)

但是,我希望控件包含一个网格,然后将内容放置在网格中。ContentPresenter从概念上讲(即忽略不能以这种方式使用的事实),我希望NewControl.xaml看起来像这样:

<ContentView ...>
  <Grid x:Name="HiddenGrid">
    <ContentPresenter />
  </Grid>
</ContentView>
Run Code Online (Sandbox Code Playgroud)

执行我上面详细介绍的操作会导致HiddenGrid被 替换Image,而不是将图像作为 的子项插入可视化树中ContentPresenter

目前,我正在通过派生Grid而不是 来实现我的目标ContentView,但我想隐藏此实现细节,以便消费者无法干扰Grid并拥有一个只能分配单个内容的控件。

这看起来应该很简单(并且广泛适用于需要以某种方式修饰内容的各种场景),但我看不出有什么方法可以做到这一点。我是否遗漏了一些明显的东西,这是不可能的,还是只是很难做到并且我需要阅读一些东西(例如控制模板)?

Jai*_*pta 5

我们可以使用ControlTemplate。Xamarin.Forms 控件模板允许定义 ContentView 派生的自定义控件和 ContentPage 派生页面的视觉结构。

<ContentView.ControlTemplate>
        <ControlTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"></RowDefinition>
                    <RowDefinition Height="*"></RowDefinition>
                </Grid.RowDefinitions>
                <Label Text="Test" Grid.Row="0"></Label>
                <ContentPresenter Grid.Row="1"></ContentPresenter>

            </Grid>
        </ControlTemplate>
        
    </ContentView.ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

沙姆尔

<local:NewControl>
  <Label Text= "Test"/>
</local:NewControl>
Run Code Online (Sandbox Code Playgroud)