Как установить Высота элементов в XAML, чтобы они всегда занимали одинаковую долю доступного пространства в родительском ItemsControl? - PullRequest
1 голос
/ 18 марта 2010

У меня есть ItemsControl со следующим ItemTemplate:

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

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

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

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

Ответы [ 2 ]

7 голосов
/ 18 марта 2010

Вы можете использовать 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>

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

РЕДАКТИРОВАТЬ: Как указал Джон ниже, этот код еще проще:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1" IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
0 голосов
/ 18 марта 2010

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

...