2010-03-18 3 views
1

У меня есть ItemsControl со следующим ItemTemplate:Как установить Высота элементов в XAML, чтобы они всегда занимали одну и ту же долю доступного пространства в родительских элементах ItemsControl?

<DataTemplate x:Key="myItemTemplate"> 
    <TextBlock Height="???" Text="{Binding Path=Description}" /> 
</DataTemplate> 

Моим вопрос, как я могу установить высоту TextBlock в шаблоне так, чтобы он автоматически принимает на себя ItemsControl.Height div ItemsCount количество вертикального пространства?

Если есть только один элемент, я бы хотел, чтобы это была полная высота контейнера, когда их было два, каждый должен быть в два раза меньше и так далее.

Если возможно, я бы предпочел сделать это полностью в XAML, чтобы моя ViewModel была чистой логикой пользовательского интерфейса.

ответ

6

Вы можете использовать UniformGrid в качестве ItemsPanelTemplate и связать Rows свойство числа элементов в вашем ItemsControl, например, так:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Rows="{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" IsItemsHost="True"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

Я не проверял этот код, так что вам нужно, чтобы проверить его, но я думаю, что идея понятна.

EDIT: Как отметил Джон ниже, этот код еще проще:

<ItemsControl> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Columns="1" IsItemsHost="True"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 
+4

На самом деле, это проще. UniformGrid автоматически позаботится о счете Row, если вы установите Columns = «1». И вам нужно использовать ItemsControl.ItemsPanel для этого вместо ItemTemplate. –

+0

О, это круто. Я не знал об этом. Спасибо за совет! И спасибо за указание «ошибка» в моем примере кода. Я случайно написал «ItemTemplate» вместо «ItemsPanel». Исправлено в приведенном выше сообщении. – gehho

0

Я собираюсь попробовать и помнить об этом, как интеллектуальное упражнение, как я новичок в WPF. Я не сомневаюсь, что со временем меня исправят. I думаю, что вы можете указать постоянную пропорцию, добавив знак% к значению высоты, то есть Height = "50%". Это обманчиво, так как оно будет содержать все числовые значения высот элементов внутри родительского элемента и размер каждого из них в качестве доли этой суммы. Например, три текстовых блока каждый из высоты = «50%» будут иметь высоту (50/150) * height of datatemplate = 1/3.

+0

Я полагаю, вы думаете о «звездной» сетке, но это не сработает, потому что количество строк неизвестно и не фиксировано. Ну, может быть рабочее решение, но я думаю, что это намного больше. – gehho