想要在 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 普拉贾帕蒂
在我看来
,你正在重新发明轮子。
每个组都将包含控件,周围环绕着矩形边框,并且每个子组的左上角将放置一个标题(可选),其边框上方
现有控件完美地涵盖了这一点: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>