一尘不染

如何创建具有名称内容的WPF用户控件

c#

我有一组带有附加命令和逻辑的控件,它们以相同的方式不断重复使用。我决定创建一个包含所有通用控件和逻辑的用户控件。

但是,我还需要控件能够容纳可以命名的内容。我尝试了以下方法:

<UserControl.ContentTemplate>
    <DataTemplate>
        <Button>a reused button</Button>
        <ContentPresenter Content="{TemplateBinding Content}"/>
        <Button>a reused button</Button>
    </DataTemplate>
</UserControl.ContentTemplate>

但是,似乎无法放置在用户控件内的任何内容。例如,如果我以以下方式使用控件:

<lib:UserControl1>
     <Button Name="buttonName">content</Button>
</lib:UserControl1>

我收到以下错误:

无法在元素“按钮”上设置“名称”属性值“ buttonName”。“按钮”在元素“
UserControl1”的范围之内,该元素在另一个范围中定义时已经注册了名称。

如果删除buttonName,它将进行编译,但是我需要能够命名内容。我该如何实现?


阅读 364

收藏
2020-05-19

共1个答案

一尘不染

当使用XAML时,这似乎是不可能的。当我实际拥有所需的所有控件时,自定义控件似乎是一个过大的杀伤力,但只需要将它们与少量逻辑组合在一起并允许命名的内容即可。

Mackenir认为,京东博客上的解决方案似乎是最好的折衷方案。扩展JD解决方案以允许仍在XAML中定义控件的方法如下:

    protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);

        var grid = new Grid();
        var content = new ContentPresenter
                          {
                              Content = Content
                          };

        var userControl = new UserControlDefinedInXAML();
        userControl.aStackPanel.Children.Add(content);

        grid.Children.Add(userControl);
        Content = grid;           
    }

在上面的示例中,我创建了一个名为UserControlDefinedInXAML的用户控件,该控件的定义类似于使用XAML的任何普通用户控件。在我的UserControlDefinedInXAML中,我有一个名为aStackPanel的StackPanel,我希望在其中显示我的命名内容。

2020-05-19