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

时间:2013-09-20 20:41:25

标签: c# silverlight

我想在矩形边框内创建多组控件。其中每个组将包含其中的控件,由矩形边框包围,并且标题(可选)将被放置在每个子组的左上边缘上方。     所以,我创建了一个类 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 Prajapati

1 个答案:

答案 0 :(得分: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>