【问题标题】:want to create Group Template user control in silverlight想在 silverlight 中创建组模板用户控件
【发布时间】:2013-09-21 05:00:48
【问题描述】:

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

【问题讨论】:

    标签: c# silverlight


    【解决方案1】:

    在我看来你是在重新发明轮子。

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

    这完全被现有控件覆盖: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>
    

    【讨论】:

    • 感谢 McGarnagle,但您能否建议我如何在不使用 HeaderContentControl 的情况下实现相同的行为。并不是说其他​​开发人员(将使用此控件)只会提供 DataGrid/Grid 作为此模板控件的子元素,但他们可以提供任何应创建自己的组的子控件。
    猜你喜欢
    • 2013-01-29
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多