想要在 Silverlight 中创建组模板用户控件

本文关键字:用户 控件 创建组 Silverlight | 更新日期: 2023-09-27 18:32:22

我想在矩形边框内创建多组控件。 其中每个组将包含其中的控件,周围环绕着矩形边框,并且标题(可选)将放置在每个子组的左上角的边框上方。 因此,我创建了一个类 GroupLayout,其中的每个子元素都必须创建自己的新组。我创建了标头作为附加属性。

使用模板的语法如下:-

<GroupLayout Orientation = "Vertical">
 <DataGrid GroupLayout.Header= "Group 1" />
 <Grid GroupLayout.Header= "Group 2" />
 -------So On--------
</GroupLayout>

如上所述,DataGrid 和 Grid 都应该形成两个垂直方向的组。 每个子元素都应创建自己的新组。所以,我尝试将其作为用户控制:-

<Style TargetType = "GroupLayout">
 <Setter.Property>
   <ControlTemplate TargetType="GroupLayout">
      <StackPanel>
        <Border x:Name="MainParentGroupBorder">
          <StackPanel>
            <ContentPresenter Content = "{TemplateBinding HeaderLabel}" />
            <Border x:Name="ChildGroupBorder">
              <ContentPresenter Content = "{TemplateBinding Content}" />
            </Border>
          </StackPanel>
        </Border>
      </StackPanel>
     </ControlTemplate>
   </Setter.Property>
  </Style>

在后面的代码中,我从 ItemsControl 开车。
但是,这没有按要求工作。现在经过很多努力,我想我必须在这里用Xaml实现ItemTemplate。但我无法这样做以获得所需的结果。请帮助我。

谢谢

GK 普拉贾帕蒂

想要在 Silverlight 中创建组模板用户控件

在我看来

,你正在重新发明轮子。

每个组

都将包含控件,周围环绕着矩形边框,并且每个子组的左上角将放置一个标题(可选),其边框上方

现有控件完美地涵盖了这一点:HeaderedContentControl。 您所要做的就是为其提供适当的控件模板。 我建议这样:

<ItemsControl>
    <controls:HeaderedContentControl Header="Group 1">
        <DataGrid />
    </controls:HeaderedContentControl>
    <controls:HeaderedContentControl Header="Group 2">
        <Grid />
    </controls:HeaderedContentControl>
</ItemsControl>

现在,为HeaderedContentControl提供适当的模板:

<Style TargetType="controls:HeaderedContentControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="controls:HeaderedContentControl">
                <StackPanel>
                    <Border x:Name="MainParentGroupBorder">
                        <StackPanel>
                            <ContentPresenter Content="{TemplateBinding Header}" />
                            <Border x:Name="ChildGroupBorder">
                                <ContentPresenter Content="{TemplateBinding Content}" />
                            </Border>
                        </StackPanel>
                   </Border>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

编辑

扩展上述内容 - 如果您需要使用附加属性GroupLayout.Header的特定语法,那么我建议您的GroupLayout类覆盖ItemsControl.GetContainerForItem方法。 让它返回一个实例 HeaderedContentControl

protected override DependencyObject GetContainerForItemOverride()
{
    return new HeaderedContentControl();
}

现在,您可以使用另一个 ItemsControl 重写(PrepareContainerForItemOverride)来传递附加的属性:

protected virtual void PrepareContainerForItemOverride(DependencyObject element, Object item)
{
    // get the attached property from the ItemsControl item
    string header = ((FrameworkElement)item).GetValue(GroupLayout.Header) as string;
    // set the container's "Header"
    ((HeaderedContentControl)element).Header = header;
}

现在,你可以使用所需的确切 XAML 语法:

<GroupLayout Orientation = "Vertical">
    <DataGrid GroupLayout.Header= "Group 1" />
    <Grid GroupLayout.Header= "Group 2" />
</GroupLayout>