Как предотвратить использование TextBlock всего доступного пространства

Вот моя проблема. Я построил следующее 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, получают все доступное пространство (то есть всю строку), если сообщение слишком длинное. Как я могу ограничить его, чтобы он оставался только в одной половине родительской сетки и в конечном итоге заставил текст переполняться?

РЕДАКТИРОВАТЬ: Я добавил изображение, показывающее мою проблему. Четвертое сообщение должно переполниться, но это не так.

Как предотвратить использование TextBlock всего доступного пространства

установите для него свойство horizontalAllignment

Denis Schaf 11.06.2019 13:10

@DenisSchaf уже попробовал текстовый блок. Я поставил его на растяжение, но это ничего не дало

Daniele Sartori 11.06.2019 13:19

попробуйте «слева», «справа» или «по центру», так как strech заставит его занять все доступное пространство

Denis Schaf 11.06.2019 13:22

это тоже не сработало

Daniele Sartori 11.06.2019 14:10

Рассматривали ли вы возможность использования определения столбца для этой сетки?

Kevin Cook 11.06.2019 14:45

Вы можете получить лучшие ответы, если продемонстрируете проблему лучше (более четко), см. минимальный воспроизводимый пример. Покажи скриншот, как дела сейчас, и еще один, где ты покажешь, как ты хочешь, чтобы было.

Sinatr 11.06.2019 14:48

Столбец уже определен шириной 5* каждый. Проблема, насколько я могу судить, заключается в том, что когда столбец сетки не имеет содержимого внутри, он не резервирует места.

Daniele Sartori 11.06.2019 14:48

@Sinatr добавил изображение, чтобы вы могли лучше понять

Daniele Sartori 11.06.2019 15:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Это должно поместить 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 половину. Вот почему я реализовал все в одном списке

Daniele Sartori 11.06.2019 15:09
Ответ принят как подходящий

Мне потребовалось несколько минут, чтобы создать Макви, но недостающая часть головоломки заключается в следующем:

<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>

Другие вопросы по теме