我正在构建一个可以处理第三方模块的应用程序。
所有模块必须具有相同的外观和感觉,因此我为了方便而创建了一个.dll。
问题使用我的自定义用户控件模板 ModuleChrome 时,开发人员无法选择名为 ToolBar &的子容器。 身体及其各自的孩子。这非常不方便,因为在设计器中选择子元素时,会选择整个用户控件( ModuleChrome )。
问题如何在 ToolBar &设计师可以选择 Body 吗?
ModuleChrome的课程
public class ModuleChrome : UserControl
{
public static readonly DependencyProperty ToolBarProperty = DependencyProperty.Register("ToolBar", typeof(object), typeof(ModuleChrome), new UIPropertyMetadata(null));
public static readonly DependencyProperty BodyProperty = DependencyProperty.Register("Body", typeof(object), typeof(ModuleChrome), new UIPropertyMetadata(null));
public object ToolBar
{
get { return (object)GetValue(ToolBarProperty); }
set { SetValue(ToolBarProperty, value); }
}
public object Body
{
get { return (object)GetValue(BodyProperty); }
set { SetValue(BodyProperty, value); }
}
static ModuleChrome()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ModuleChrome), new FrameworkPropertyMetadata(typeof(ModuleChrome)));
}
}
及其相应的风格
<Style TargetType="{x:Type local:ModuleChrome}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ModuleChrome}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<!--Main Content-->
<ContentControl Grid.Row="1">
<ContentControl Content="{TemplateBinding Body}"/>
</ContentControl>
<!--Toolbar-->
<Grid Grid.Row="0" Background="White">
<Grid.Effect>
<DropShadowEffect ShadowDepth="0" BlurRadius="4" Opacity="0.5"/>
</Grid.Effect>
<ContentControl Content="{TemplateBinding ToolBar}"/>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用
<chrome:ModuleChrome ....
....
....
xmlns:chrome="....">
<chrome:ModuleChrome.ToolBar>
<Grid Background="White"/>
</chrome:ModuleChrome.ToolBar>
<chrome:ModuleChrome.Body>
<Grid Background="White"/>
</chrome:ModuleChrome.Body>
</chrome:ModuleChrome>
我在网上搜索了一个解决方案,但显然找不到它。提前谢谢。
更新
我已经将其用于单个用户控件
代码隐藏:
public partial class MultiChildDemo : UserControl
{
public static readonly DependencyPropertyKey ToolBarProperty = DependencyProperty.RegisterReadOnly(
"ToolBar",
typeof(UIElementCollection),
typeof(MultiChildDemo),
new PropertyMetadata());
public static readonly DependencyPropertyKey BodyProperty = DependencyProperty.RegisterReadOnly(
"Body",
typeof(UIElementCollection),
typeof(MultiChildDemo),
new PropertyMetadata());
public UIElementCollection ToolBar
{
get { return (UIElementCollection)GetValue(ToolBarProperty.DependencyProperty); }
set { SetValue(ToolBarProperty, value); }
}
public UIElementCollection Body
{
get { return (UIElementCollection)GetValue(BodyProperty.DependencyProperty); }
set { SetValue(BodyProperty, value); }
}
public MultiChildDemo()
{
InitializeComponent();
ToolBar = gridToolBar.Children;
Body = gridBody.Children;
}
}
和xaml:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid Grid.Row="1" x:Name="gridBody"/>
<Grid x:Name="gridToolBar" Grid.Row="0" Background="White">
<Grid.Effect>
<DropShadowEffect ShadowDepth="0" BlurRadius="4" Opacity="0.5"/>
</Grid.Effect>
</Grid>
</Grid>
此方法存在问题
这是在单个用户控件中,我可以在每个模块(usercontrol)中使用它,但我需要将此功能传输到我的CustomControl,因为UserControls不允许在将内容用作模板时命名内容。
如果我们找到解决方案,我会更新答案。