2013-09-10 9 views
1

У меня есть окно, которое использует SizeToContent="WidthAndHeight", и у меня есть столбец с тремя строками в нем. Строки определяются как таковые:WPF Sizing Grid.Row к контенту

<Grid.RowDefinitions> 
    <RowDefinition /> 
    <RowDefinition /> 
    <RowDefinition /> 
</Grid.RowDefinitions> 

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

Моя проблема заключается в следующем: когда мое приложение начинается, три вышеупомянутые строки имеют размер, соответствующий содержанию внутри них. Так что это выглядит довольно аккуратно. Если первая строка содержит только один элемент в ListBox, размер будет достаточно, чтобы соответствовать этим элементам. Остальные две строки (если они переполнены содержимым) будут разделять оставшуюся часть пополам и отображать полосы прокрутки, если пользователь хочет видеть переполнения в каждом из них. Однако, как только я изменил размер главного окна, три строки сразу переопределят себя так, чтобы каждый из них был точно такой же высоты, независимо от количества содержимого в них.

Я попытался использовать Height="Auto" в определениях строк внешней сетки; тем не менее, размер каждой строки точно соответствует содержанию, что приводит к тому, что они переполняются с экрана, даже не позволяя полосам прокрутки.

Я пробовал все настройки, о которых я знаю (ключ: знаю), и я не мог его решить. На данный момент я избавился от SizeToContent, так что эта странная ошибка не произойдет, но строки пропорциональны друг другу, независимо от количества контента в них ... и мне бы хотелось, чтобы это было наоборот. Я не хочу статическую высоту для каждой из строк, а вместо того, чтобы их динамически изменять размер, основываясь на количестве контента в них, не выходя из экрана.

Есть ли способ исправить это?

ответ

1

Чтобы получить его правильно, вам нужно будет сделать свой собственный Panel, который обрабатывает распределение по размерам умнее, чем стандартный Grid. Этот проект может быть хорошей отправной точкой: ConstrainingStackPanel

+0

Это фантастическая ссылка.Это очень похоже на то, что я пытаюсь выполнить. Он содержит все в пределах доступного пространства. Спасибо огромное! –

1

В вашем XAML можно привязать к свойству в вашей ViewModel

<Grid.RowDefinitions> 
    <RowDefinition Height="{Binding Row1Height}"/> 
    <RowDefinition Height="{Binding Row2Height}"/> 
    <RowDefinition Height="{Binding Row3Height}"/> 
</Grid.RowDefinitions> 

Затем в ViewModel

public int Row1Height { get; set; } 
public int Row2Height { get; set; } 
public int Row3Height { get; set; } 

И есть некоторые вычисления, заполняющие это значение, как только у Вас есть содержание.

+0

кажется хорошей идеей. Большая работа по расчёту идет, но я не нашел ничего, что могло бы это сделать. –

0

Предполагая, что я правильно понял ваш вопрос, попробовали ли вы его обернуть внутри ScrollViewer и выключить панель управления для ListView?

Я обнаружил, что рендеринг макета в WPF может быть как положительным, так и костылем. Иногда боль в прикладе позволяет ему работать правильно, когда дело доходит до размера содержимого.

Если ScrollViewer не подходит, вы можете легко выполнить что-то подобное, написав какое-то пристрастное поведение (я делал это в прошлом), но в этом случае это переполнение.

Пример ScrollViewer подхода:

<Grid> 
    <ScrollViewer> 
     <ListView ItemsSource="{Binding Something}" ScrollViewer.VerticalScrollBarVisibility="Hidden"> 
    : 
    : 
    : 
    </ScrollViewer> 
</Grid> 
+0

Я пробовал этот подход; однако, если я добавлю их все в ScrollViewer, тогда я буду прокручивать все три из них одновременно. Проблема заключается в том, что если первая имеет тонну контента, другие два будут где-то за пределами экрана. Я хочу, чтобы все три были видны одновременно. Если каждый из них завернут в ScrollViewer, то аналогичные результаты будут такими же, как и раньше. –

+0

Я вижу ... если бы я был вами, я бы, наверное, посмотрел на написанное приложенное поведение для обработки автосохранения. Это обеспечит полный контроль над размерами в ваших руках. У меня, к сожалению, нет возможности сесть и сделать это прямо сейчас. Однако я знаю, что это выполнимо. – tronious