我有一组带有附加命令和逻辑的控件,它们以相同的方式不断重复使用。我决定创建一个包含所有通用控件和逻辑的用户控件。
但是,我还需要控件能够容纳可以命名的内容。我尝试了以下方法:
<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,它将进行编译,但是我需要能够命名内容。我该如何实现?
当使用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,我希望在其中显示我的命名内容。