2010-10-04 59 views
0

我有一個DockPanel中,我動態填使用一個ItemsControl填充面板。 dockpanel需要itemcontrol列表中的最後一個孩子來填充面板的其餘部分,但是如果以這種方式填充它,似乎不會發生這種情況......我能做些什麼來獲得最後一項來擴展?DockPanel中的ItemsControl lastchild填補

片斷我怎麼有它設置:(注意我設置DockPanel中背景爲藍色,所以我可以從面板的背景區分填充用戶控件)

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

我目前的假說至於發生了什麼事情,子填充正在應用於項目控件,而不是項目控件中填充的子項。我用制定者在過去指定孩子應該停靠在面板實例的側面......但似乎沒有要個孩子二傳手選項得到它擴大...

回答

3

正在發生的事情是,你的DockPanel中充滿的ItemsControl。到現在爲止還挺好。然而,ItemsControl的內部使用一個StackPanel如果設置爲方向=「橫向」不能垂直填充(水平

編輯:要解釋的背景是藍色的...... 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 ..- UPS應該至少做粗版本。如果項目大到可以包含,它就像一個普通的堆疊面板一樣工作 - 如果不是,它會安排孩子將剩餘的空間均勻地分配到它們之​​間。如果需要,您可以調整它以按比例分配(即,較大的塊獲得更多的剩餘空間)。

最後的編輯(我想:-))你需要把這個自定義面板的ItemsPanelTemplate內,而不是UniformGrid我剛纔所說的。

+0

所以它的動態...集合被添加或從用戶減去 – tbischel 2010-10-04 17:43:53

+0

好吧 - 我會用一個建議更新我的答案。 – Goblin 2010-10-04 17:45:34

+0

所以我沒有顯示它,但每個項目的大小並不一致......每個控件都包含一個根據用戶輸入的文本而改變的包裝文本塊。這仍然可以使用「uniformgrid」作爲模板嗎? (請參閱此處瞭解控件應該是什麼樣子的快照:http://stackoverflow.com/questions/3808663/inter-related-stack-panel-sizing) – tbischel 2010-10-04 17:55:25

0

難道你將DockPanel.Dock屬性設置爲你想要的值?

+0

設置爲填寫ItemsControl,因爲它是DockPanel的唯一子節點。 – Goblin 2010-10-04 17:42:35

0

我會扔了一個不雅的解決方案:

在模型視圖,印章的列表綁定到包含所有,但最後一個元素的列表,然後分別的最後一個元素。然後使用項目控件作爲列表,並手動添加一個鏈接到最後一個元素的額外條目。我討厭這樣做,所以希望有更好的辦法。

6

不要放在DockPanelItemsControl;將DockPanel放在ItemsControl中。使用ItemsPanelTemplate使ItemsControl奠定了項目從一個DockPanel

使用ItemContainerStyle設置項目容器上的DockPanel.Dock屬性(對於ItemsControl,將爲ContentPresenter s)。

<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> 
+0

這絕對是岩石! :) – AwkwardCoder 2017-02-03 15:01:02