Как WPB ListBox, с пользовательским шаблоном ItemsPanel, может изменять размеры в зависимости от размера своих элементов - PullRequest
1 голос
/ 10 октября 2009

Это дополнительный вопрос к этому , на который был дан ответ.

Используя код:

<ListBox ScrollViewer.VerticalScrollBarVisibility="Disabled">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel Orientation="Vertical"/>
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

Вы можете создать список, в котором элементы заполняют ListBox в столбцах слева направо, а последний элемент в определенном столбце никогда не обрезается (то есть, если элемент был слишком высоким, он перемещается в верхнюю часть). следующего столбца). Как я мог теперь динамически настроить Width из ListBox, чтобы «подогнать» его предметы и получить то же поведение по горизонтали. Итак, предположим следующее:

Если в данном Height необходим только один Column, чтобы соответствовать всем элементам, Width из ListBox должен быть размером Width элементов.

Или, в данном Height должно быть четыре Column с, размер должен быть в четыре раза больше Width элементов.

Наконец, скажем, в данном Height должно быть больше Column s, чем максимально допустимый Width из ListBox, ему нужно будет вычислить, насколько широким он должен быть, чтобы элементы в Column s, которые не смогут поместиться, не обрезались, а просто не показывались, пока пользователь не прокрутил вправо.

Спасибо за вашу помощь !!

EDIT:

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

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

Спасибо!

1 Ответ

1 голос
/ 11 октября 2009

Это довольно сложный вопрос. Я не уверен на 100%, чего вы здесь добиваетесь ... нужно ли увеличивать или уменьшать количество столбцов, которые вы видите, по мере увеличения высоты ? Я надеюсь, что это уменьшится, но если вы сформулируете свой вопрос, кажется, вы хотите противоположного, и я пытаюсь это понять.

Я думаю, что базовое понимание системы макетов WPF действительно полезно при попытке понять эти вопросы. Еще одна полезная вещь - это то, что размер чего-либо во многом определяется его контейнером макета , а не самой вещью.

В вашем вопросе вы спрашиваете, как получить размер ListBox в зависимости от содержимого. ListBox - это не элемент управления макетом , а нечто вроде WrapPanel. Функция WrapPanel, скажем, при той же ширине, даже если содержимое Panel увеличивается в размере. Это не то же самое для других элементов управления, таких как Grid, например.

Вот несколько хороших ссылок о системе макетов в WPF. Надеюсь, это поможет. Вернитесь с разъяснением своего вопроса и посмотрите, не сможем ли мы получить вам дополнительную помощь, если она вам понадобится.

http://www.wpftutorial.net/LayoutProperties.html http://msdn.microsoft.com/en-us/library/ms745058.aspx

...