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