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