C# DockPanel项目控制最后一个子项填充

C# DockPanel项目控制最后一个子项填充,c#,wpf,itemscontrol,fill,dockpanel,C#,Wpf,Itemscontrol,Fill,Dockpanel,我有一个dockpanel,我使用ItemsControl动态填充该面板。dockpanel需要itemscontrol列表中的最后一个子项来填充面板的其余部分,但是如果我以这种方式填充它,它似乎不会发生。。。我能做些什么来扩展最后一项 我如何设置它的片段:(注意,我将dockpanel背景设置为蓝色,以便能够区分填充的用户控件和面板的背景) 我目前的假设是,子项填充将应用于itemscontrol,而不是itemscontrol中填充的子项。我过去使用过setters来指定子对象应该停靠

我有一个dockpanel,我使用ItemsControl动态填充该面板。dockpanel需要itemscontrol列表中的最后一个子项来填充面板的其余部分,但是如果我以这种方式填充它,它似乎不会发生。。。我能做些什么来扩展最后一项

我如何设置它的片段:(注意,我将dockpanel背景设置为蓝色,以便能够区分填充的用户控件和面板的背景)




我目前的假设是,子项填充将应用于itemscontrol,而不是itemscontrol中填充的子项。我过去使用过setters来指定子对象应该停靠在面板的一侧,例如。。。但是似乎没有子setter选项使其展开…

是否将DockPanel.Dock属性设置为所需的值?

发生的情况是,DockPanel中填充了ItemsControl。到现在为止,一直都还不错。但是,ItemsControl内部使用的StackPanel无法垂直填充(如果设置为Orientation=“Horizontal”,则为水平填充)

编辑:解释背景为蓝色…ItemsControl的背景默认设置为空

你知道这件收藏品有多少件吗

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;
    }
}
公共类CustomPanel:StackPanel
{
受保护的替代尺寸排列替代(尺寸最终化)
{
var childUIElements=Children.OfType().ToList();
foreach(childUIElements中的变量child)
{
儿童。测量(最终化);
}
double remainingHeight=finalSize.Height-childUIElements.Sum(c=>c.DesiredSize.Height);

如果(剩余高度我会抛出一个不雅观的解决方案:


在modelview中,将列表绑定拆分为一个包含除最后一个元素外的所有元素的列表,然后分别包含最后一个元素。然后对列表使用items控件,并手动添加链接到最后一个元素的额外条目。我不想这样做,希望有更好的方法。

不要将
ItemsControl
放在
中>DockPanel
;将
DockPanel
放在
ItemsControl
中。使用
ItemsPanelTemplate
使
ItemsControl
DockPanel
中布局其项目

使用
ItemContainerStyle
设置项目容器上的
DockPanel.Dock
属性(对于
ItemsControl
,该属性将是
ContentPresenter
s)


阿索斯
波尔托斯
阿拉米斯
达尔达尼央

设置为在ItemsControl上填充,因为它是DockPanel的唯一子控件。因此它是动态的…集合由用户添加或减去,因此我不显示它,但每个项的大小都不一致…每个控件都包含一个包装的文本块,该文本块根据用户输入的文本进行更改。这样还可以吗使用“uniformgrid”作为模板?(请参见此处以获取控件的外观快照:)啊,这使问题变得复杂…您需要实现一个自定义面板。我将再次更新:-)。好的,看起来很有希望。因此,我没有使用itemcontrol和dockpanel,而是直接绑定到面板的itemssource,并像以前一样给它一个模板。我会尝试一下!呃,不。只需将上面的面板放在ItemsControl的ItemsPanel中。这绝对震撼!:)太棒了!!!正是我要找的!
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;
    }
}
<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>