0

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

使用模板的语法如下:-

<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 帕加帕提

4

1 回答 1

0

在我看来,您正在重新发明轮子。

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

现有控件完美地涵盖了这一点: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>
于 2013-09-20T20:50:51.303 回答