2014-09-04 35 views
1

例如,我們有一個帶有UnidormGrid(如ListBoxPanel)的ListBox。UniformGrid如何使用無限大小

<ListBox> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid Columns="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}, Path=Items.Count}"></UniformGrid> 
       <!--<cntr:StackGrid Orientation="Horizontal" Direction="Normal"/>--> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <Button>1</Button> 
     <Button>2</Button> 
     <Button>3</Button> 
     <Button>4</Button> 
    </ListBox> 

ListBox將給無限大小UniformGrid,但沒有任何錯誤。 UniformGrid將只使用可見的大小。它是如何做到的?它會幫助我建立我自己的小組。

P.S.我知道,我可以禁用ListBox中的ScrollView,並且我的面板將顯示可見大小。

+1

您可以閱讀MSDN上的[Panels Overview](http://msdn.microsoft.com/en-us/library/ms754152.aspx)文章。它有一個關於自定義面板的部分。 – Clemens 2014-09-04 06:08:34

+0

沒有關於如何使用無限大小的信息。 – Nodon 2014-09-04 06:27:06

+2

從[UIElement.Measure](http://msdn.microsoft.com/en-us/library/system.windows.uielement.measure.aspx)中的備註部分以及[UIElement.Arrange](http:// msdn.microsoft.com/en-us/library/system.windows.uielement.arrange.aspx):* availableSize可以是從零到無窮的任何數字*。這不是一個錯誤,而只是意味着面板可以佈置其子項的大小不受限制。你只需要處理它。但是您必須從MeasureOverride或ArrangeOverride中返回無限大小。 – Clemens 2014-09-04 06:47:43

回答

1

據我所知,UniformGrid通過它顯示的最大的孩子來導出它的單元大小。根據Orientation屬性,當其寬度或高度超出時,它將內容分割成新行。默認情況下,它設置爲Horizontal

這將我引向您的問題:您爲什麼認爲它具有無限寬度?當然,ListBox在其默認控制模板中包含一個ScrollViewer,但在我看來,它只爲面板提供垂直無限空間(水平方向,限制爲列表框的寬度),這允許默認均勻網格中斷髮生。

如果您還有其他問題,請隨時詢問。