在自定义usercontrol中选择子控件

时间:2016-01-02 12:11:25

标签: c# wpf user-controls custom-controls design-time

我正在构建一个可以处理第三方模块的应用程序。

所有模块必须具有相同的外观和感觉,因此我为了方便而创建了一个.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不允许在将内容用作模板时命名内容。

如果我们找到解决方案,我会更新答案。

0 个答案:

没有答案