Вот моя проблема. Я построил следующее ListView
<ListView Grid.Row = "1" x:Name = "messageList" BorderThickness = "0"
ItemsSource = "{Binding MySource}"
HorizontalContentAlignment = "Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "5*"/>
<ColumnDefinition Width = "5*"/>
</Grid.ColumnDefinitions>
<WrapPanel Grid.Row = "0" Grid.Column = "0">
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Received.SenderId}"
/>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Received.DeliverDate}"
/>
</WrapPanel>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Received.MsgText}"
Grid.Row = "1" Grid.Column = "0"
TextWrapping = "WrapWithOverflow">
</TextBlock>
<WrapPanel Grid.Row = "0" Grid.Column = "1">
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Sent.SenderId}"
/>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Sent.DeliverDate}"
/>
</WrapPanel>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Sent.MsgText}"
Grid.Row = "1" Grid.Column = "1"
TextWrapping = "WrapWithOverflow">
</TextBlock>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Для каждого элемента MySource только 1 между Received и Sent не будет нулевым. ListView работает так, как я ожидаю, размещая элемент слева или справа от экрана, но TextBlock, содержащие MsgText, получают все доступное пространство (то есть всю строку), если сообщение слишком длинное. Как я могу ограничить его, чтобы он оставался только в одной половине родительской сетки и в конечном итоге заставил текст переполняться?
РЕДАКТИРОВАТЬ: Я добавил изображение, показывающее мою проблему. Четвертое сообщение должно переполниться, но это не так.
@DenisSchaf уже попробовал текстовый блок. Я поставил его на растяжение, но это ничего не дало
попробуйте «слева», «справа» или «по центру», так как strech заставит его занять все доступное пространство
это тоже не сработало
Рассматривали ли вы возможность использования определения столбца для этой сетки?
Вы можете получить лучшие ответы, если продемонстрируете проблему лучше (более четко), см. минимальный воспроизводимый пример. Покажи скриншот, как дела сейчас, и еще один, где ты покажешь, как ты хочешь, чтобы было.
Столбец уже определен шириной 5* каждый. Проблема, насколько я могу судить, заключается в том, что когда столбец сетки не имеет содержимого внутри, он не резервирует места.
@Sinatr добавил изображение, чтобы вы могли лучше понять





Проблема в том, что ваша сетка (и ширина столбца) рассчитывается для каждого элемента вашего списка, поэтому она занимает максимально возможное место. Предлагаю резервное решение, лучше не нашел но результат есть.
Это должно поместить 2 ListView в 2 столбца сетки, а затем получить элемент Received в одном и Sent в другом.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListView Grid.Column = "0" x:Name = "messageListReceived" BorderThickness = "0"
ItemsSource = "{Binding MySource}"
HorizontalContentAlignment = "Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<WrapPanel Grid.Row = "0">
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Received.SenderId}"
/>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Received.DeliverDate}"
/>
</WrapPanel>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Received.MsgText}"
Grid.Row = "1"
TextWrapping = "WrapWithOverflow">
</TextBlock>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView Grid.Column = "1" x:Name = "messageListSent" BorderThickness = "0"
ItemsSource = "{Binding MySource}"
HorizontalContentAlignment = "Stretch">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<WrapPanel Grid.Row = "0">
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Sent.SenderId}"
/>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Sent.DeliverDate}"
/>
</WrapPanel>
<TextBlock Margin = "2"
VerticalAlignment = "Center"
Text = "{Binding Sent.MsgText}"
Grid.Row = "1"
TextWrapping = "WrapWithOverflow">
</TextBlock>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
Здравствуйте, спасибо за ваши усилия. К сожалению, это была именно моя первая реализация. Проблема в том, что это создает 2 отдельных элемента управления с 2 разными прокрутками. Поскольку то, что я показываю, вероятно, не помещается на экране, мне нужно прокрутить чат, но недопустимо прокручивать только 1 половину. Вот почему я реализовал все в одном списке
Мне потребовалось несколько минут, чтобы создать Макви, но недостающая часть головоломки заключается в следующем:
<Grid MaxWidth = "{Binding ActualWidth, RelativeSource = {RelativeSource AncestorType = {x:Type ListView}}}">
Это ограничило бы максимальную ширину всех Grid (каждый элемент имеет один) и позволило бы выполнить перенос. В противном случае Grid равно спрашивая для ширины, чтобы весь элемент помещался в одну строку, и ListView с этим все в порядке, но тогда вы увидите горизонтальную полосу прокрутки (самый ненавистный элемент управления пользователями, включая меня).
MCVE:
public partial class MainWindow : Window
{
public class Item
{
public string Received { get; set; }
public string Sent { get; set; }
}
public List<Item> Items { get; }
public MainWindow()
{
InitializeComponent();
Items = new List<Item>
{
new Item { Received = "1111 111 11 111 11 1" },
new Item { Received = "2222 2 22 2 2 222222222 2 222222 22222222 222222222222 2" },
new Item { Sent = "333333333 3333333 333 33333 3 3 33 333333333 3333" },
new Item { Received = "444444444444444 444 44444444444444 44 4 44444444444444444 4 4 4444444444 4 444 444444444444" },
};
DataContext = this;
}
}
Снимок экрана:
Xaml:
<ListView ItemsSource = "{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid MaxWidth = "{Binding ActualWidth, RelativeSource = {RelativeSource AncestorType = {x:Type ListView}}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width = "*" />
<ColumnDefinition Width = "*" />
</Grid.ColumnDefinitions>
<TextBlock Text = "{Binding Received}"
TextWrapping = "WrapWithOverflow" />
<TextBlock Grid.Column = "1"
Text = "{Binding Sent}"
TextWrapping = "WrapWithOverflow" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemContainerStyle>
<Style TargetType = "ListViewItem">
<Setter Property = "HorizontalContentAlignment"
Value = "Stretch" />
</Style>
</ListView.ItemContainerStyle>
</ListView>
установите для него свойство horizontalAllignment