0

ItemsControlを使用してパネルにデータを入力するために動的に入力するドックパネルがあります。ドックパネルは、パネルの残りの部分を埋めるためにitemscontrolリストの最後の子を必要としますが、この方法でデータを入力しても発生しないようです...最後のアイテムを展開するにはどうすればよいですか?

設定方法のスニペット:(入力されたユーザーコントロールとパネルの背景を区別できるように、ドックパネルの背景を青に設定していることに注意してください)

        <DockPanel Background="Blue" LastChildFill="True" Margin="0">
        <ItemsControl ItemsSource="{Binding Requirements}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <local:TMGrid2View Baseline="{Binding}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </DockPanel>

何が起こっているかについての私の現在の仮説は、itemscontrol内に入力された子ではなく、child-fillがitemscontrolに適用されているというものです。私は過去にセッターを使用して、たとえば子をパネルの側面にドッキングするように指定しました...しかし、子セッターを拡張するためのオプションはないようです...

4

4 に答える 4

9

に入れないItemsControlでくださいDockPanel; に入れDockPanelますItemsControl。を使用しItemsPanelTemplateItemsControl、アイテムをでレイアウトしますDockPanel

を使用して、アイテムコンテナItemContainerStyleのプロパティを設定します(これは、の場合はsになります)。DockPanel.DockItemsControlContentPresenter

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <ItemsControl Margin="5">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <DockPanel LastChildFill="True"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
      <Style TargetType="ContentPresenter">
        <Setter Property="DockPanel.Dock" Value="Top"/>
      </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <TextBlock Background="Lavender" Margin="1" Padding="5" Text="{Binding}"/>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
    <sys:String>Athos</sys:String>
    <sys:String>Porthos</sys:String>
    <sys:String>Aramis</sys:String>
    <sys:String>D'Artagnan</sys:String>
  </ItemsControl>
</Page>
于 2010-10-04T19:32:23.003 に答える
3

何が起こっているのかというと、DockPanelがItemsControlで満たされているということです。ここまでは順調ですね。ただし、ItemsControlは、垂直方向に塗りつぶすことができないStackPanelを内部的に使用します(Orientation = "Horizo​​ntal"に設定されている場合は水平方向に)。

編集:背景が青であることを説明するために...ItemsControlの背景はデフォルトでnullに設定されています。

コレクションにいくつのアイテムがあるか知っていますか?

EDIT2:動的コレクションの場合に必要なことは、次を追加することです。

<ItemsControl ...>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!-- rest of ItemsControl properties -->
</ItemsControl>

ユニフォームグリッドは、水平方向と垂直方向の両方で各セルに等しい量のスペースを割り当て、ItemsPanelは標準のStackPanelを配置と交換します。

EDIT3:高さが等しくないアイテムの操作...カスタムパネル:

public class CustomPanel : StackPanel
{
    protected override Size ArrangeOverride(Size finalSize)
    {
        var childUIElements = Children.OfType<UIElement>().ToList();
        foreach (var child in childUIElements)
        {
            child.Measure(finalSize);
        }
        double remainingHeight = finalSize.Height - childUIElements.Sum(c => c.DesiredSize.Height);
        if(remainingHeight <= 0)
            return base.ArrangeOverride(finalSize);

        double yOffset = 0;
        foreach (var child in childUIElements)
        {
            double height = child.DesiredSize.Height + remainingHeight/childUIElements.Count;
            child.Arrange(new Rect(0,yOffset,finalSize.Width,height));
            yOffset += height;
        }
        return finalSize;
    }
}

あまり多くのf..-upを作成していない場合は、少なくとも大まかなバージョンを実行する必要があります。アイテムが大きすぎて収容できない場合は、通常のスタックパネルのように機能します。そうでない場合は、残りのスペースをそれらの間で均等に分割するように子を配置します。必要に応じて、比率で割り当てるように調整できます(つまり、ブロックが大きいほど残りのスペースが増えます)。

最後の編集(私は思う:-))このカスタムパネルは、前に提案したUniformGridではなくItemsPanelTemplate内に配置する必要があります。

于 2010-10-04T17:43:03.813 に答える
0

DockPanel.Dockプロパティを必要な値に設定しましたか?

于 2010-10-04T17:41:41.900 に答える
0

私はエレガントでない解決策を捨てます:

モデルビューで、リストバインディングを、最後の要素を除くすべてを含むリストに切り刻み、次に最後の要素を個別に切り取ります。次に、リストのアイテムコントロールを使用して、最後の要素にリンクするエントリを手動で追加します。私はこれをしたくないので、うまくいけばもっと良い方法があります。

于 2010-10-04T17:58:25.250 に答える