0

長方形の枠内に複数のコントロール グループを作成したいと考えています。各グループにはコントロールが含まれ、長方形の境界線で囲まれ、ヘッダー (オプション) が各子グループの境界線の上の左上に配置されます。そのため、クラスGroupLayoutを作成しました。この中の各子要素は、独自の新しいグループを作成する必要があります。添付プロパティとしてヘッダーを作成しました。

テンプレートを使用する構文は次のとおりです。

<GroupLayout Orientation = "Vertical">
 <DataGrid GroupLayout.Header= "Group 1" />
 <Grid GroupLayout.Header= "Group 2" />
 -------So On--------
</GroupLayout>

上記のように、DataGrid と Grid は両方とも、垂直方向の独自の 2 つのグループを形成する必要があります。各子要素は、独自の新しいグループを作成する必要があります。だから、私はこれをユーザーコントロールとして試しました:-

<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ことをお勧めします。のインスタンスを返すようにします:GroupLayoutItemsControl.GetContainerForItemHeaderedContentControl

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 に答える