You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF/Avalonia:如何在模板化控件中注入自定义控件?

实现模板化控件动态插入自定义控件(Avalonia/WPF)

步骤1:给自定义控件添加Content属性支持

在ExampleControl的后台代码中,定义Content依赖属性并标记为控件的默认内容属性,让外部使用时可直接在控件标签内嵌套元素:

using Avalonia;
using Avalonia.Controls;

namespace YourNamespace.Controls
{
    [ContentProperty(nameof(Content))]
    public class ExampleControl : Control
    {
        public static readonly StyledProperty<object> ContentProperty =
            AvaloniaProperty.Register<ExampleControl, object>(nameof(Content));

        public object Content
        {
            get => GetValue(ContentProperty);
            set => SetValue(ContentProperty, value);
        }
    }
}

WPF版本仅需调整命名空间与依赖属性注册方式,核心逻辑完全一致。

步骤2:修改控件模板,添加ContentPresenter展示传入内容

在ControlTemplate的Grid第0列位置,用ContentPresenter绑定Content属性,实现外部控件的渲染:

<Style Selector="controls|ExampleControl">
    <Setter Property="Template">
        <ControlTemplate TargetType="{x:Type controls:ExampleControl}">
            <Grid RowDefinitions="*"
                  ColumnDefinitions="3*, *"
                  ShowGridLines="True">

                <!-- 绑定Content属性,显示外部传入的控件 -->
                <ContentPresenter Grid.Column="0"
                                  Content="{TemplateBinding Content}"/>

                <TextBlock Grid.Column="1"
                           Text="Hi!"/>

            </Grid>
        </ControlTemplate>
    </Setter>
</Style>

步骤3:窗口中使用控件,传入自定义内容

直接在ExampleControl标签内部添加目标控件即可,比如绑定ViewModel中LabelText属性的TextBlock:

<controls:ExampleControl>
    <TextBlock Text="{Binding LabelText}"/>
</controls:ExampleControl>

如果是代码后置绑定,可先定义控件:

<controls:ExampleControl>
    <TextBlock x:Name="MyLabel" />
</controls:ExampleControl>

再在代码后置中设置内容:

MyLabel.Text = "从代码后置设置的文本";
// 或绑定属性
MyLabel.Bind(TextBlock.TextProperty, this.GetObservable(MainWindowViewModel.LabelTextProperty));

内容的提问来源于stack exchange,提问作者TNTzx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:12:21