WPF:自定义控件中的多个内容演示者?
我正在尝试创建一个自定义控件,该控件需要由子控件定义 XAML 的 2 个或多个区域 - 继承自此控件。我想知道是否有一种方法可以定义多个内容呈现器和一个充当默认内容呈现器的方法
<MyControl>
<MyControl.MyContentPresenter2>
<Button Content="I am inside the second content presenter!"/>
</MyControl.MyContentPresenter2>
<Button Content="I am inside default content presenter" />
</MyControl>
这是否可能,如何在自定义控件的模板中定义它?
I'm trying to have a custom control that requires 2 or more areas of the XAML to be defined by a child control - that inherits from this control. I'm wondering if there's a way to define multiple contentpresenters and one which acts as the default content presenter
<MyControl>
<MyControl.MyContentPresenter2>
<Button Content="I am inside the second content presenter!"/>
</MyControl.MyContentPresenter2>
<Button Content="I am inside default content presenter" />
</MyControl>
Is this possible, how do I define this in the custom control's template?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
模板可以像这样绑定单独的
ContentPresenter
实例(我在这里只设置了一个属性,但您可能想要设置其他属性):控件本身应该公开内容的两个属性并设置默认使用
ContentPropertyAttribute
:The template can just bind the separate
ContentPresenter
instances like this (I've only set one property here but you'll likely want to set others):The control itself should expose two properties for content and set the default using the
ContentPropertyAttribute
:您可以将“ItemsControl”与自定义模板一起使用。
You can use an "ItemsControl" with a custom template.
这是另一个选项,不需要制作自定义控件,并且比执行 ItemsControl 更类型安全(如果类型安全是您想要的……也许不需要):
...使用附加属性!
创建适当类型的附加属性。我们碰巧需要一个文本控件,所以我做了一个字符串 TextContent 附加属性。然后从模板创建一个 TemplateBinding 到它,并在 Xaml 中实例化时也将其设置在那里。效果很好。
Here's another option that doesn't require making a custom control and is more typesafe than doing the ItemsControl thing (if type safety is something you want..perhaps not):
...Use an attached property!
Create an attached property of the appropriate type. We happened to need a text control so I did a string TextContent attached property. Then create a TemplateBinding to it from the template, and when instantiating in Xaml set it there as well. Works nicely.