Форум программистов, компьютерный форум, киберфорум
C#: XAML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/76: Рейтинг темы: голосов - 76, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205

Avalonia (отображение списка строк)

12.01.2022, 22:23. Показов 21008. Ответов 98
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, в каком элементе управления в Авалонии лучше выводить список строк, чтобы потом можно было выделить какие-то строки и скопировать их, например, в Excel? Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2022, 22:23
Ответы с готовыми решениями:

Avalonia
Приходилось ли кому работать с сабжем ? С WPF знаком не сильно. Но нужна кроссплатформенность. Собственно сабж это и позволяет, грубо...

ListView - ping строки, выбираемой из списка/отображение списка онлайн машин в сети
Доброй ночи, форумчане! Возник насущный вопрос... Может быть, уже и обсуждался, но, по неведомым мне причинам, или я не понял, или не...

Скрытие\отображение нового списка при выборе значения из списка
Например при выборе option(1,2,3,5) должен появиться другой список который указывает количество сахара, а при выборе option(4) должен...

98
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 11:58
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В формате это не возможно.
В формате это невозможно, но я добавил пробелы тут через высчитывание самого длинного слова в "колонке" учитывая сам Header -- получилось криво.

Добавлено через 1 минуту
Цитата Сообщение от limeniye Посмотреть сообщение
можно сделать 3 TextBlock'a( как три колонки ). По идее, если растягивается один, растягиваются и остальные.
этот вариант ещё не пробовал.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16159 / 11279 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
03.02.2022, 11:59
Цитата Сообщение от limeniye Посмотреть сообщение
XML
1
<TextBlock Text = "{Binding UserName, StringFormat='{}   {0}   {1}   {2} '}}" />
Вот этого тоже не понял.
А к чему будут применяться индексы 1,2,3?
Ведь входное значение только одно что с конвертером, что без него.....
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 12:00
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Ведь входное значение только одно что с конвертером, что без него.....
это к кому вопрос? Ко мне? Я и не говорил, что оно будет работать. Я лишь после Binding добавил свойство.

Было так:
XML
1
<TextBlock Text = "{Binding StringFormat='{}   {0}   {1}   {2} '}}" />
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16159 / 11279 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
03.02.2022, 12:06
Цитата Сообщение от limeniye Посмотреть сообщение
В формате это невозможно, но я добавил пробелы тут через высчитывание самого длинного слова в "колонке" учитывая сам Header -- получилось криво.
Потому, что в WPF это надо решать через замену шаблона элемента.
Там должен быть Grid, который в контекст принимает массив значений, и в каждой его клонке выводится значение с соответствующим индексом.
Что-то в подобном духе:
XML
1
2
3
4
5
6
7
8
9
<Grid x:Name="grid">
    <Grid DataContext="{Binding DataContext, ElementName=grid, Converter={SplitConverter}}">
     <!-- Здесь объявление колонок -->
     
    <!-- И потом привязка по индексам  -->
        <TextBlock Grid.Collumn="0" Text="{Binding [0]}"/>
        <TextBlock Grid.Collumn="1" Text="{Binding [1]}"/>
    </Grid>
</Grid>
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 12:08
Элд Хасп, как вариант
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16159 / 11279 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
03.02.2022, 12:11
Цитата Сообщение от limeniye Посмотреть сообщение
Ко мне? Я и не говорил, что оно будет работать. Я лишь после Binding добавил свойство.
К вам как к более знающему.
К ТС какой смысл вопросы задавать?
Ему надо разъяснять как правильно, а не интересоваться у него этим.
Видно же, что даже по самым азам "плавает" и не только WPF, но и Шарпа.

Добавлено через 2 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
как вариант
Другой вариант - использование в конвертере вместо пробелов, табуляции.
Но это тоже не всегда даст требуемый результат.
Самый надёжный - это через сплит и отдельный вывод каждого значения.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 12:13
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Самый надёжный - это через сплит и отдельный вывод каждого значения.
сколько символов -- столько текстблоков?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16159 / 11279 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
03.02.2022, 12:16
Цитата Сообщение от limeniye Посмотреть сообщение
сколько символов -- столько текстблоков?
Не символов, а значений которые нужно позиционировать.
В задаче ТС - это три значения.
Если их очень много (больше 5-10), то можно использовать вложенный ItemsControl.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 19:53
Sun1212, окей если Вас устроит по-простому, то можно просто сделать 3 текстблока и задать каждому из них фиксированное значение, например 100 пикселей по ширине.

Для этого я создал ItemTemplate -- то есть стиль каждого элемента в списке. Стиль содержит три текстблока по горизонтале.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                    <ListBox Grid.Row="1" Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple">
                        <ListBox.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Copy" Command="{Binding CopySelectedItems}" />
                            </ContextMenu>
                        </ListBox.ContextMenu>
 
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Background="Red">
                                    <TextBlock Text="{Binding Number}" Width="100"/>
                                    <TextBlock Text="{Binding Name}"  Width="100"/>
                                    <TextBlock Text="{Binding Value}" Width="100"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
В таком случае код немного изменится.
Теперь вместо string будем использовать свой тип Document, это нужно для того, чтобы мы всегда знали где у "Леонардо ди сер Пьеро да Винчи" имя, фамилия и отчество, грубо говоря. То есть мы будем держать значения не в одной строке, а в трёх разных.
C#
1
2
3
4
5
6
7
8
9
10
11
    public class Document
    {
        public string Number { get; set; }
        public string Name { get; set; }
        public string Value { get; set; }
 
        public override string ToString()
        {
            return Number + " " + Name + " " + Value;
        }
    }
C#
1
2
3
4
5
6
7
        public ObservableCollection<Document> Items { get; set; } = new ObservableCollection<Document>()
        {
            new Document { Number = "Номер", Name = "Название", Value = "Значение"},
            new Document { Number = "0.01", Name = "A1", Value = "2.1e+002"},
            new Document { Number = "0.02", Name = "A2", Value = "2.1e+003"},
            new Document { Number = "0.03", Name = "A3", Value = "2.3e+004"}
        };
Теперь, когда пользователь выделяет какой-то элемент, его нужно преобразовать в строку(чтобы отобразить в нижнем TextBox'е).
Для этого у типа Document есть переопределение метода ToString().
Мы берём каждое свойство этого объекта и преобразовываем в одну строку
return Number + " " + Name + " " + Value; -- в этой вот строке.

Теперь нужно подставить преобразование для каждого объекта сюды:
C#
1
2
3
4
5
            _selectedItemsAsText = SelectedItems
                .ToObservableChangeSet()
                .ToCollection()
                .Select(x => string.Join(" ", x.Select(objToString => objToString.ToString())))
                .ToProperty(this, x => x.SelectedItemsAsText);
Добавлено через 1 минуту
Но можно сделать ещё немного по-другому. Можно высчитать размер самого длинного TextBlock'a и каждому из них задать его размер.
Миниатюры
Avalonia (отображение списка строк)  
2
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16159 / 11279 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
03.02.2022, 22:53
Цитата Сообщение от limeniye Посмотреть сообщение
Но можно сделать ещё немного по-другому. Можно высчитать размер самого длинного TextBlock'a и каждому из них задать его размер.
Ну, можно ещё исполльзовать и размерные группы.
Правда не могу точно сказать будут ли они работать в столь сложной компоновке.

Но, честно говоря, мне всё это кажется всё более и более бессмысленным.
По сути сделали свой DataGrid или ListView.
Так почему бы сразу ими и не воспользоваться?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 22:58
Элд Хасп, там в начале темы было написано, что должно быть именно в списке, одной колонкой. Потом оказалось что это три колонки в одной. Я предложил вариант с DataGrid — как я понял, он был одобрен, но потом я вспомнил, что нужно по нажатию на одну ячейку — выделять строку, чтобы её перенести в нижний текстбокс и мне показалось, что изменять придётся полностью всё, я решил закончить, что есть.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 23:10
Не то, чтобы мне лень
но это курсовая, я не думаю что там обязательно делать всё идеально.
Миниатюры
Avalonia (отображение списка строк)  
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
04.02.2022, 11:19  [ТС]
limeniye, спасибо большое!
Можно дилетанский вопрос, у меня вся информация попадает в одну колонку, хотя делаю Grid с разбиением на столбцы... Что делаю не так?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Grid RowDefinitions ="*,*" ColumnDefinitions="*,*,*">
    <ListBox Grid.Row="0" Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple">
                        <ListBox.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Copy" Command="{Binding CopySelectedItems}" />
                            </ContextMenu>
                        </ListBox.ContextMenu>
 
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal" Background="Red">
                                    <TextBlock Grid.Column="0" Text="{Binding Number}" Width="100"/>
                                    <TextBlock Grid.Column="1" Text="{Binding Name}"  Width="100"/>
                                    <TextBlock Grid.Column="2" Text="{Binding Value}" Width="100"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox> 
</Grid>
Добавлено через 4 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
Теперь, когда пользователь выделяет какой-то элемент, его нужно преобразовать в строку(чтобы отобразить в нижнем TextBox'е).
Для этого у типа Document есть переопределение метода ToString().
Мы берём каждое свойство этого объекта и преобразовываем в одну строку
Скажите, пожалуйста, хотелось бы, чтобы пользователь мог выделить несколько строк и скопировать их, например, в Excel в таком же виде (чтобы всё не объединилось в одну строку)? Как такое сделать? Заранее спасибо!
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.02.2022, 11:46
Вы выделили в гриде два ряда — Grid.RowDefinitions = "*, *" и три колонки ColumnDefinitions="*, *, *".

А лист бокс Вы поместили в первый ряд, первую колонку.
Grid.Row="0" — это значение по умолчанию, его необязательно писать. Следовательно если Вы не указываете Grid.Column, то он тоже имеет значение 0 — то есть первая колонка.
Укажите значение Grid.Column="1", чтобы переместить Ваш список во вторую колонку (отсчёт с нуля, не забывайте), или, если Вы хотите например переместить его сразу в две колонки (например в первую и вторую), тогда указывайте Grid.ColumnSpan="2". В таком случае он попадёт и в колонку 0 и в колонку 1.

Если Вы хотите поместить его в две последние колонки, то укажите Grid.Column="1" и потом Grid.ColumnSpan="2". Так как мы не указываем Grid.Column — он изначально 0, то и Grid.ColumnSpan поместит список в две первые колонки, а когда мы указываем Grid.Column="1", то мы указываем от какого элемента Grid.ColumnSpan должен "заполнить" нужное количество колонок.

Добавлено через 10 минут
чтобы пользователь мог выделить несколько строк и скопировать их, например, в Excel
- для начала Вам нужно отловить нажатие клавиш "Ctrl" + "C". Думаю примеров в интернете — валом;
- потом, когда пользователь жмакнет эти преславутые кнопки, нужно подсунуть ему какую-то информацию в буфер обмена, например "Hello World";
- если всё успешно, то нужно в буфер обмена ему передать свойство SelectedItemsAsString. Это оно хранит выделенные элементы, которые отображаются в TextBox'e, внизу.

Попробуйте сами сделать каждый пункт. Наработки отправляйте сюды.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
04.02.2022, 11:50  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
А лист бокс Вы поместили в первый ряд, первую колонку.
Grid.Row="0" — это значение по умолчанию, его необязательно писать. Следовательно если Вы не указываете Grid.Column, то он тоже имеет значение 0 — то есть первая колонка.
Укажите значение Grid.Column="1", чтобы переместить Ваш список во вторую колонку (отсчёт с нуля, не забывайте), или, если Вы хотите например переместить его сразу в две колонки (например в первую и вторую), тогда указывайте Grid.ColumnSpan="2". В таком случае он попадёт и в колонку 0 и в колонку 1.
опять получается, что все данные попадают в одну колонку...
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.02.2022, 11:51
покажите
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
04.02.2022, 12:00  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
если всё успешно, то нужно в буфер обмена ему передать свойство SelectedItemsAsString. Это оно хранит выделенные элементы, которые отображаются в TextBox'e, внизу.
У меня в буфер обмена выделенные элементы копируются с помощью реактивной команды CopySelectedItems. Как сделать, чтобы несколько выделенных строк копировались в итоге не одной строкой, а несколькими?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.02.2022, 12:12
Sun1212, чтобы они просто были одна под другой? Это не сложно, но Вы бежите вперёд. Для начала разберитесь как отловить Ctrl + C. Пусть при нажатии этих кнопок у Вас будет что-то происходить для теста, например вызываться ошибка
throw new ArgumentException("Была нажата комбинация клавиш Ctrl + C");.
Остальное, пока что, не имеет значения.
Поищите эту информацию в интернете, я уверен что это очень простая задача.

Добавлено через 5 минут
я вот о крыл гугл, сразу же нашёл ответ — событие KeyDown
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16159 / 11279 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
04.02.2022, 13:06
Цитата Сообщение от limeniye Посмотреть сообщение
нужно по нажатию на одну ячейку — выделять строку, чтобы её перенести в нижний текстбокс и мне показалось, что изменять придётся полностью всё
При выборе ячейки выделяется же вся строка.
Что в DataGrid, что в ListView.

Добавлено через 11 минут
Цитата Сообщение от Sun1212 Посмотреть сообщение
опять получается, что все данные попадают в одну колонку...
Потому что Grid должен быть внутри шаблона данных, а не снаружи ListBox.

Что-то в таком духе (пишу здесь - могут быть ошибки):

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <ListBox SelectionMode="Multiple"
                Grid.IsSharedSizeScope="True">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Background="Red">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="firstColumn"/>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="secondColumn"/>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="thirdColumn"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="{Binding Number}"/>
                    <TextBlock Grid.Column="1" Text="{Binding Name}"/>
                    <TextBlock Grid.Column="2" Text="{Binding Value}"/>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
Добавлено через 2 минуты
Вот не знаю только в Авалонии есть размерные группы или нет.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.02.2022, 13:12
Элд Хасп, честно говоря -- не понмманию что и куда, там же стоял <StackPanel Orientation="Horizontal" Background="Red">

Добавлено через 3 минуты
Одно и тоже, только строк меньше
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.02.2022, 13:12

Скрытие\отображение нового списка при выборе значения из списка с выбором одного элемента
Добрый день!Существует список из которого нужно выбрать один элемент, с выбором элемента отображается ниже другой список с выбором другого...

Отображение списка и работа с элементом списка
Всем привет. Я пишу программу, используя MVC, которая будет выводить список тестов, сохраненных в базе в браузер. Когда пользователь...

Даны два списка строк. Из списка один удалить повторяющиеся элементы списка два
Даны два списка строк. Из списка один удалить повторяющиеся элементы списка два.

Avalonia, азы
Как на Авалонии создать кнопку, которая при клике на нее вызовет окно, на котором выведется текст, к примеру: Привет, юзер! Саму кнопку я...

Для одноуровневого списка строк сформировать итоговую строку сцеплением всех элементов списка
Определить функцию, которая для одноуровневого списка строк формирует итоговую строку сцеплением всех элементов списка. Элементы в итоговой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru