Есть чат на WPF, в нем каждое сообщение должно выглядеть как на картинке, возможно ли как то сделать шаблон через код, или на каждое сообщение прописывать каждый элемент? Если вопрос я задал непонятный или некорректный, напишите в комментариях.
Asked
Active
Viewed 589 times
1 Answers
6
Есть обычный ItemsControl, с которым даже делать ничего не нужно, чтобы он формировал вертикальный стек элементов. Покажу только разметку без привязок, но вам потребуются привязки Binding, чтобы ей воспользоваться
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" Background="LightGray" Margin="5">
<DockPanel>
<Border Width="50" Height="50" BorderBrush="Black" BorderThickness="1" Margin="5">
<Image Source=".."/>
<!-- Здесь Source будет указывать на путь к картинке.
Путь может быть как на диске, так и в сети, то есть URL. -->
</Border>
<TextBlock Text="Имя" Margin="5"/>
<TextBlock HorizontalAlignment="Right" Text="21:55" Margin="5"/>
</DockPanel>
<TextBlock Margin="5" Text="Текст сообщения" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
aepot
- 49,560
-
-
ScrollViewerдля этого есть. Я старался не усложнять ответ. Вопрос был про то, как разметить сообщение. – aepot May 05 '20 at 15:19

UserControl. У него получается должно быть 4 поля. 1) Текст сообщения 2) Имя 3) Дата 4) Изображение профиля. Как мне эти поля прописать в .cs юзерконтрола? – VeNNoM May 05 '20 at 16:04Теперь нам нужно сделать основной класс, который будет задан как DataContext, некий MainViewModel.и до конца идет использование созданного контрола. Тот контрол имеет свои свойства по типуText,DoubleTextи др, они привязываются из коллекции к XAML. – EvgeniyZ May 05 '20 at 16:08StackPanel. На него добавляются юзерконтролы как на картинке. Мне как то надо реализовать так, чтобы сообщения загружались порционно. Например, последние 30 сообщений. Если прокручивать наверх, то прогружаются еще сообщения. Нет идей как это сделать? Или если это звучит сложно, то как хотя бы добавлять вStackPanelэлементы перед предыдущим элементом(не после, а перед)? – VeNNoM May 06 '20 at 15:37StackPanel? Это UI, вид интерфейса, а не источник данных! У вас должна быть коллекция (в моем примере этоObservableCollection<ButtonViewModel> Buttons) в которую вы помещаете все, что вам надо, не трогая интерфейс. По поводу вашего вопроса - задайте лучше новый, может там люди дадут полный ответ, а так это называется "виртуализация". – EvgeniyZ May 06 '20 at 16:13MainViewModelгде указан в этом примере? В .cs файле юзерконтрола? – VeNNoM May 06 '20 at 17:45