如何创建一个自定义控件,用户可以在 Xamarin.Forms 中添加任何类型的视图?

Posted

技术标签:

【中文标题】如何创建一个自定义控件,用户可以在 Xamarin.Forms 中添加任何类型的视图?【英文标题】:How to create a custom control that user can add any kinds of view into it in Xamarin.Forms? 【发布时间】:2022-01-20 04:12:29 【问题描述】:

我想创建一个自定义控件,让用户可以将任何视图添加到特定位置,如下所示:

MyCustomControl.xaml

<ContentView ...>

    <!-- My customizations ... -->

    <StackLayout>
    <!-- Everything added by user should goes here -->
    </StackLayout>

    <!-- My other customizations ... -->

</ContentView>

使用时:

<ContentPage>

    <controls:MyCustomControl>
        <Label />
        <Image />
        ...
    <controls:MyCustomControl>

</ContentPage>

我该怎么做?

【问题讨论】:

有几种方法可以做到这一点。您希望能够在 XAML 或代码中添加自定义内容吗? @CodingLumis 很好,我想在 XAML 中做大​​部分事情 【参考方案1】:

我将在此处发布一种执行此操作的方法,但还有其他方法。根据您的问题,我假设您想在各个地方重用 ContentView 并在实例化它时允许更改该内容视图的一部分。我将假设您将在 XAML 中指定自定义部分。您可以使用以下模式来实现此目的:

创建您的 ContentView 并为自定义部分添加可绑定属性:

ContentViewWithCustomPart.xaml

<ContentView.Content>
    <StackLayout>
        <Label Text="I'm always here!" />
        <StackLayout x:Name="StackToHoldCustomStuff">
            <!-- Stuff goes here injected by bindable property -->
        </StackLayout>
    </StackLayout>
</ContentView.Content>

ContenViewWithCustomPart.xaml.cs

public partial class ContentViewWithCustomPart : ContentView

    public static readonly BindableProperty CustomViewProperty = 
            BindableProperty.Create(nameof(CustomView), typeof(View), typeof(ContentViewWithCustomPart), propertyChanged: OnViewChanged);

    static void OnViewChanged(object bindable, object oldValue, object newValue)
    
        var page = (ContentViewWithCustomPart)bindable;
        page.StackToHoldCustomStuff.Children.Clear();
        if (newValue != null) page.StackToHoldCustomStuff.Children.Add((View)newValue);
    

    public View CustomView  get => (View)GetValue(CustomViewProperty); set => SetValue(CustomViewProperty, value); 

    public ContentViewWithCustomPart()
    
       InitializeComponent();
    

在演示页面中的使用:

<ContentPage.Content>
    <StackLayout>
        <cv:ContentViewWithCustomPart>             
            <cv:ContentViewWithCustomPart.CustomView>
                <Label Text="I'm a custom bit!" />
            </cv:ContentViewWithCustomPart.CustomView>
        </cv:ContentViewWithCustomPart>
    </StackLayout>
</ContentPage.Content>

结果:

【讨论】:

这是个好主意。我会试一试。谢谢!

以上是关于如何创建一个自定义控件,用户可以在 Xamarin.Forms 中添加任何类型的视图?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms 命令在自定义控件中始终为空

如何在 Xamarin 表单 macos 的条目(用于聊天)中添加自定义图像?

如何在Xamarin的形式创建自定义抽屉?

C# 自定义控件(圆形进度条) Xamarin Forms

Xamarin.Forms 将自定义控件创建为网格布局中的一行

如何在自定义用户控件上创建单击事件?