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

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

12.01.2022, 22:23. Показов 21035. Ответов 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
01.02.2022, 12:37
Студворк — интернет-сервис помощи студентам
У Вас первый параметр object value -- туда приходит то, что Вы указываете при Binding'е.

Кстати, только сейчас заметил.
Вы тут пишите StringFormat
XML
1
<TextBlock Text = "{Binding StringFormat='{}   {0}   {1}   {2} '}}" />
Но не указываете свойство к которому биндите StringFormat:
XML
1
<TextBlock Text = "{Binding UserName, StringFormat='{}   {0}   {1}   {2} '}}" />
В общем и целом -- не важно.
Сначала давайте объявим Ваш конвертёр:
XML
1
2
3
4
5
    <Window.Resources>
        <ResourceDictionary>
            <converters:StringFormatConverter x:Key="StringFormatConverter" />
        </ResourceDictionary>
    </Window.Resources>
Теперь мы можем его подключить к TextBlock'у
XML
1
<TextBlock Text = "{Binding SomeProperty, Converter={StaticResource StringFormatConverter}" />
Теперь вернёмся к конвёртеру. Что нам приходит? -- object, а кого типа у нас свйоство SomeProperty? -- скорее всего string.
Сначала попробуем узнать пришёл ли нам string
C#
1
2
3
4
5
6
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var myString = value as string;
            if (myString == null)
                return value;
        }
Если myString -- null, значит это не string, а если не string -- значит мы ничего не конвертируем а просто возвращаем обратно наше значение через return value;.

И так, допустим мы убедились, что это string, что дальше нужно сделать?
Как я понял у Вас в string попадает две строки, нужно взять только вторую:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public class StringFormatConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var myString = value as string;
            if (myString == null)
                return value;
 
            // разбиваем string на массив строк
            var lines = myString.Split('\n');
            if (lines.Length > 1)
            {
                return lines[1]; //отдаём вторую строку. 1 -- потому что отсчёт в нуля
            }
 
            // если у нас длинна массива меньше одного -- тогда просто возвращаем изначальное значение.
            return value;
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new ArgumentException();
        }
    }
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,169
Записей в блоге: 2
01.02.2022, 13:44
Цитата Сообщение от Sun1212 Посмотреть сообщение
Правильно ли так будет?
Нет.
StringFormat может работать только с одним значением, ведь свойство тоже принимает только одно значение.
Поэтому все элементы с индексами не равными 0 будут игнорироваться.

Добавлено через 1 минуту
Для вашей задачи вам нужен именно конвертер.
Выше limeniye дал пример такого конвертера.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 13:47
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Выше limeniye дал пример такого конвертера.
Хотел бы дополнить.

Данный конвертер просто из двух строк берёт вторую, но он не разбивает её на нужный Вам временный формат. С этим пока не будем спешить, сначала попробуйте запустить код из поста #41
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 18:05  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
Но не указываете свойство к которому биндите StringFormat:
XMLВыделить код
1
<TextBlock Text = "{Binding UserName, StringFormat='{}   {0}   {1}   {2} '}}" />
У меня такой код:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
        <ListBox Grid.Row="0" Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}">
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Copy" Command="{Binding $parent[ListBox].DataContext.CopySelectedItems}"/>
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
В наблюдаемой коллекции Items - список подобного вида:

"Название документа"
"Название Номер Значение"
"A1 0.01 2,1e+002"
"A2 0.02 2.2e+003"
................
"A100 0,03 2.3e+004"

Хотелось бы выровнять строки, начиная с третьей, чтобы было похоже на таблицу

Добавлено через 1 минуту
Если пишем конвертер, то нужно ли указывать следующее свойство?

Цитата Сообщение от limeniye Посмотреть сообщение
Но не указываете свойство к которому биндите StringFormat:
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 18:17
Цитата Сообщение от Sun1212 Посмотреть сообщение
Хотелось бы выровнять строки, начиная с третьей, чтобы было похоже на таблицу
Выровнять по центру?
с этого
Code
1
2
3
4
5
6
"Название документа"
"Название Номер Значение"
"A1 0.01 2,1e+002"
"A2 0.02 2.2e+003"
................
"A100 0,03 2.3e+004"
на это
Code
1
2
3
4
5
   "Название документа"
"Название Номер Значение"
    "A1 0.01 2,1e+002"
    "A2 0.02 2.2e+003"
   "A100 0,03 2.3e+004"
Добавлено через 5 минут
Цитата Сообщение от Sun1212 Посмотреть сообщение
Если пишем конвертер, то нужно ли указывать следующее свойство?
Да если Вам просто выровнять, то Вам не нужен конвертер.

Отвечаю на Ваш вопрос -- можем не писать StringFormat, если используем конвертёр.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 18:20  [ТС]
limeniye, мне наверно нужно просто выровнять, начиная с 3-ей строки, примерно так:

XML
1
2
3
4
5
"Название документа"
"Название Номер Значение"
 "A1           0.01    2,1e+002"
 "A2           0.02    2.2e+003"
"A100         0,03    2.3e+004"
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 18:21
Ага, по ширине, понял.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 18:22  [ТС]
Табуляция съезжает)
Значения второй колонки (0,01, 0,02, 0,03) - должлны быть под строкой "Номер", а значения третьей колонки - под строкой "Значения"
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 18:31
Цитата Сообщение от Sun1212 Посмотреть сообщение
Табуляция съезжает)
Значения второй колонки (0,01, 0,02, 0,03) - должлны быть под строкой "Номер", а значения третьей колонки - под строкой "Значения"
Ну, тогда это явно вообще дргуая задача.

Вы явно что-то неправильно поняли. Вы уверены что это всё должно быть одной колонкой, в которой три колонки накостыленные наколенке? Может по-человечски сделать через DataGrid?

типо вот так:
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 18:34  [ТС]
limeniye, может действительно лучше сделать через DataGrid
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 19:04
Sun1212, а мне нравится как Вы всегда сами сомневаетесь в правильности задачи.

Судя из поста #28, так сделать не получится.

Допустим у Вас было: "Иванов" "Иван" "Иванович" -- три отдельных слова. А стало "Иванов Иван Иванович", то есть объеденились слова. Ладно если у нас просто случай и мы можем просто разделить слова через пробел обратно в "Иванов" "Иван" "Иванович".
Но что если будет какой-то там "Леонардо ди сер Пьеро да Винчи" -- где тут разделять? -- не ясно.

То есть в одну сторону мы можем преобразовывать, а вот в обратную -- нет.

Можно чуток переписать Ваш код и не преобразовывать данные в коде, а приобразовывать данные на View. Тогда будет доступ к изначальным данным.

Потом нужно будет расписать алгоритм табуляции:
- ищем самый длинный элемент;
- добавляем другим элементам недостающие пробелы.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 19:15  [ТС]
limeniye, я в правильности своей задачи не сомневаюсь) Просто я в Авалонии новичок, не знаю, как лучше сделать, Вам доверяю!
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 19:18
Цитата Сообщение от Sun1212 Посмотреть сообщение
limeniye, может действительно лучше сделать через DataGrid
Так а Avalonia тут при чём?

Можно сделать как угодно. Можно и в ListBox всё впендюрить, можно и в DataGrid.

Если Вы не знаете такого элемента, можете глянуть тут
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 19:23  [ТС]
По поводу разделения данных - таких длинных, как
Цитата Сообщение от limeniye Посмотреть сообщение
"Леонардо ди сер Пьеро да Винчи"
у меня не будет. Можно все колонки отделить друг от друга примерно на 3 пробела.

Добавлено через 4 минуты
Цитата Сообщение от limeniye Посмотреть сообщение
Можно сделать как угодно. Можно и в ListBox всё впендюрить, можно и в DataGrid.
У меня сейчас сделано через ListBox:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
        <ListBox Grid.Row="0" Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}">
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Copy" Command="{Binding $parent[ListBox].DataContext.CopySelectedItems}"/>
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
Если делать через DataGrid - то наверно тогда не получится копировать строки, например, в Excel?

Или для DataGrid можно сделать контекстное меню?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
01.02.2022, 20:24
Sun1212, ну, я дописал код, но не учёл, что точка, по размеру, меньше чем обычный символ
Название: asfasf.png
Просмотров: 87

Размер: 4.2 Кб
Поэтому если добавить нужно количество пробелов там, где их нехватает -- не поможет.

Тут придётся только по-нормальному делать. Но сегодня, к сожалению, у меня нет времени.

Если никто не допишет, позже возьмусь.
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
01.02.2022, 20:42  [ТС]
Хорошо, буду ждать!
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
03.02.2022, 08:23  [ТС]
Если упростить задачу, в ListBox помещаются следующие данные:

"A1 0.01 2.1e+002"
"A2 0.02 2.2e+003"
........................
"A100 0.03 2.3e+004"

Подскажите, пожалуйста, как используя StringFormat для ListBox сдвинуть данные (в каждой строке вторые и третьи значения) на 3 пробела?

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
 <ListBox Grid.Row="0" Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}">
                        <TextBlock.ContextMenu>
                            <ContextMenu>
                                <MenuItem Header="Copy" Command="{Binding $parent[ListBox].DataContext.CopySelectedItems}"/>
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,169
Записей в блоге: 2
03.02.2022, 11:32
Цитата Сообщение от Sun1212 Посмотреть сообщение
как используя StringFormat для ListBox сдвинуть данные (в каждой строке вторые и третьи значения) на 3 пробела?
Никак!
StringFormat - это простейший консольный формат, полный эквивалент вот этой строки:
C#
1
Console.WriteLine(stringFormat, obj);
Вы же не можете в консоли добиться такого разделения полей, следовательно, и в WPF вы такого не можете получить.
Это ПОЛНОСТЬЮ ОДНО И ТО ЖЕ.

Для того чтобы вам в консоли добиться такого эффекта, вам нужно ПЕРЕД выводом обработать входные данные:
C#
1
2
string text = Metod(obj);
Console.WriteLine(text);
Так же и в WPF - для нужного вам форматирования вам нужно ДО ВЫВОДА обработать вашу строку.
Вы можете это с делать в VM перед записью строк в коллекцию, можете сделать в WPF конвертере который будет применяться ПЕРЕД ВЫВОДОМ.
Но такая обработка ОБЯЗАТЕЛЬНО НУЖНА.
По крайней мере пока в Шарпе не введут дополнительные форматы для строк которые можно применить в Console.WriteLine().
Так как, ещё раз пишу, консольный формат и StringFormat - это полностью одно и тоже.
Небольшая разница возникает только в синтаксисе записи в XAML из-за требований XML (даже не XAML!, а более общих).
Если же это записывать на Шарпе, то будет полностью на 100% идентичный и синтаксис.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
03.02.2022, 11:36
Элд Хасп, как раз-таки в консоле так можно. Там размер пробелов будет одинаково разделять колонки.
У меня есть такая консольная программа со второго курса.

Касательно вопроса от Sun1212 — можно сделать 3 TextBlock'a( как три колонки ). По идее, если растягивается один, растягиваются и остальные.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16164 / 11284 / 2891
Регистрация: 21.04.2018
Сообщений: 33,169
Записей в блоге: 2
03.02.2022, 11:52
Цитата Сообщение от limeniye Посмотреть сообщение
как раз-таки в консоле так можно. Там размер пробелов будет одинаково разделять колонки.
У меня есть такая консольная программа со второго курса.
Чаво?
Чё-то с утра вы вдвоём Andrey-MSK, решили меня поразить...

Причём здесь "пробелы одинакового размера" (о которых пишите вы) и "сдвинуть ... строке вторые и третьи значения ... на 3 пробела"?
То что вы пишите связанно только с используемым шрифтом.
В консоли по умолчанию используется моноширинный шрифт.
В WPF же использует какой-то из более современных с переменой шириной кегля.

А то что пишет ТС - это вставка дополнительных символов в строку.
В формате это не возможно.
Для строк предусмотрен только один формат, отображающий её полностью в неизменном виде.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2022, 11:52

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
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) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru