2010-06-14 75 views
2

我有一個奇怪的佈局的ItemsControl。不規則的佈局ItemsControl

我有以下模式的4x6的網格:

1 2 3 4 
13 14 15 16 
5 6 7 8 
17 18 19 20 
9 10 11 12 
21 22 23 24 

是否有一個簡單的方法來做到這一點?我是否應該使用6個項目控件並採用列表中的「部分」?有沒有一個很好的方法來做到這一點?通知怎麼樣?

重要的是要注意,我可能會,也可能不是很重要的,擁有全部24項存在,但佈局需要維護(認爲它像賓果卡上的東西充滿槽)

編輯:

理想情況下,我希望能夠列出清單中的項目,並在清單中的項目上做一些有趣的排序/填充類型的內容。例如,如果我有一個ObservableCollection幾個單位,單位有一個屬性「索引」,我想有一個視圖消費品集合生成,自動使用索引來填充列表。我猜一個可觀察的字典可以工作,但看起來很糟糕。也許一個新的自定義佈局面板是爲了?

回答

2

在純XAML中爲您的ItemsControl使用自定義模板有一個巧妙的方法。這是最簡單的,如果所有的「牌」有一個固定的大小,100×100說:

<!-- Wrap each card in a decorator twice as high as the card cell --> 
<DataTemplate x:Key="ItemInDoubleHighBox"> 
    <Decorator Width="100" Height="200"> 
    <Decorator Width="100" Height="100" ClipToBounds="True"> 
     <ContentPresenter /> 
    </Decorator> 
    </Decorator> 
</DataTemplate> 

<!-- Define a template for use with WrapPanel --> 
<ItemsPanelTemplate x:Key="WrapPanelTemplate"> 
    <WrapPanel /> 
</ItemsPanelTemplate> 

<!-- Now the actual ItemsControl template --> 
<ControlTemplate TargetType="ItemsControl"> 
    <Grid Width="600" Height="600" ClipToBounds="True"> 

    <!-- Items 1 to 12 --> 
    <ItemsControl ItemsSource="{TemplateBinding ItemsSource}" 
        ItemsPanel="{StaticResource WrapPanelTemplate}" 
        ItemTemplate="{StaticResource ItemInDoubleHighBox}" /> 

    <!-- Items 13 to 24 --> 
    <ItemsControl ItemsSource="{TemplateBinding ItemsSource}" 
        ItemsPanel="{StaticResource WrapPanelTemplate}" 
        ItemTemplate="{StaticResource ItemInDoubleHighBox}" 
        RenderTransform="1 0 0 1 0 -500" /> 

    </Grid> 
</ControlTemplate> 

它是如何工作的:DataTemplate中導致的項目是「雙倍行距」,只有1-12可見,和對的RenderTransform第二個ItemsControl使項目13-24,也是「雙間隔」出現在第一行項目之間的空間。

注意:您可以使高度和寬度可以進行數據綁定,但需要更多XAML。只需添加ScaleTransforms,即可在XAML中出現「200」,「500」或「600」。例如,要處理「200」,您可以在ScaleY =「0.5」的內部裝飾器上設置比例變換,並在ScaleY =「2」的每個ItemsControl上設置比例變換。現在外部裝飾器的高度將爲100,這可以是數據綁定的。其他常量可以通過類似的內容前後縮放來處理。而且由於WPF在渲染之前合併了所有變換,所以額外的變換基本上不會花費任何費用。

+0

爲什麼使用裝飾器?我也很困惑,這是如何「拆分」我的項目到1-12和13-24 否則,我喜歡這個答案。 – Firoso 2010-06-15 16:30:13

0

WPF使這個相當微不足道。基本上你只需要指定一個ItemsPanelTemplate。

<ListBox> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Columns="4" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

現在,添加到列表框的任何項目將根據面板,其在這種情況下是一個UniformGrid的佈局邏輯地佈置。

請注意,您仍然需要按照您希望它們出現的順序保留收藏中的物品。所以在將它們添加到列表框之前,我會先排序它們。如果你需要在集合中創建「洞」,那麼我會使用某種類型的佔位符對象(也許new object()會做),而不是試圖使用複雜的佈局邏輯來傳播項目。

+0

沒有專門針對WPF的收集適配器類嗎? – Firoso 2010-06-14 23:05:51

+0

我不確定你的意思。這個問題真的有兩個部分。佈局方面(使ListBox中的項目顯示在網格中)很簡單。但是我並不完全理解你打算如何將這些物品放入收藏中。 – Josh 2010-06-14 23:09:52

+0

爲您發佈編輯。 – Firoso 2010-06-15 00:45:16