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

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

12.01.2022, 22:23. Показов 20843. Ответов 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
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
04.02.2022, 13:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от limeniye Посмотреть сообщение
там же стоял <StackPanel Orientation="Horizontal" Background="Red">
Да.
А разметку вложенных TextBlock давали как для Grid.
Поэтом ни каком выравнивании не могло быть речи.
А... забыл убрать жёсткую ширину - сейчас поправлю код.

Добавлено через 2 минуты
Цитата Сообщение от Sun1212 Посмотреть сообщение
У меня в буфер обмена выделенные элементы копируются с помощью реактивной команды CopySelectedItems. Как сделать, чтобы несколько выделенных строк копировались в итоге не одной строкой, а несколькими?
Покажите как вы реализовали это.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.02.2022, 13:20
Увидел. Чекловек пытался сделать общий размер ширины указывая колонки, чтобы он был динамический. Но тогда зачем было указывать Width="100" -- тоже вопрос. Я сначала не увидел.

В любом случае так, к сожалению, нельзя.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
У меня в буфер обмена
Они копируются не в буфер обмена, а в свойство.
Sun1212, буфер обмена, это временная память, когда Вы что-то копируете.
А у Вас в программе просто выделенные элементы выводятся в TextBox, как я понимаю.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Покажите как вы реализовали это.
тык
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
04.02.2022, 14:05
Цитата Сообщение от limeniye Посмотреть сообщение
тык
Sun1212, если limeniye, показал вашу текущую реализацию, то нужно изменить получение строки: между Select (39-строка) и ToProperty нужно добавить преобразование коллекции в строку методом string.Join(Environment.NewLine, параметр).
К сожалению как правильно это сделать в реактивном программировании я не знаю.
1
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
04.02.2022, 14:09
Элд Хасп, я думаю также. Но вопрос был следующий

Цитата Сообщение от Sun1212 Посмотреть сообщение
Скажите, пожалуйста, хотелось бы, чтобы пользователь мог выделить несколько строк и скопировать их, например, в Excel в таком же виде
То есть как понял, при выделении строк, строки автоматически попадают в буфер обмена для того, чтобы потом можно было их куда-то вставить, например в Excel, или текстовый документ.

Я не увидел тут ничего про TextBox внизу. Возможно неправильно понял (я тупенький).
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
04.02.2022, 14:26
Цитата Сообщение от limeniye Посмотреть сообщение
То есть как понял, при выделении строк, строки автоматически попадают в буфер обмена для того, чтобы потом можно было их куда-то вставить, например в Excel, или текстовый документ.
Для буфера обмена нужно создавать отдельный блок обработки.
Мне никогда такое не было нужно, поэтому представление в общих чертах.
Буфер обмена поддерживает форматированный текс.
Поэтому в него надо записывать несколько представлений скопированных строк.
Просто перевода строки между строками мало.
Ведь и одна ячейка Excel может содержать несколько строк текста.
Поэтому нужно задавать в буфере разметку на строки и общей текст (допустим для вставки в блокнот).
Так же знаю что можно форматировать сам текст: цвет, шрифт и т.п.

Но на счёт работы с буфером, мне кажется нужно открыть отдельную тему в общем Шарп разделе.
Собственно, к WPF это не имеет никакого отношения.

По сути стоит такая задача:
Есть массив string[] или string[][] - нужно его так занести в буфер обмена, чтобы при вставке в Excel значения вставились по нужным строкам и колонкам.
1
04.02.2022, 14:31

Не по теме:

Элд Хасп, аналогично

0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
05.02.2022, 15:57  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Цитата Сообщение от Sun1212 Посмотреть сообщение
У меня в буфер обмена выделенные элементы копируются с помощью реактивной команды CopySelectedItems. Как сделать, чтобы несколько выделенных строк копировались в итоге не одной строкой, а несколькими?
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
25
26
27
 public class MainWindowViewModel : ViewModelBase
    {
        public ObservableCollection<string> SelectedItems { get; set; } = new ObservableCollection<string>();
 
        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"}
        };
 
        public ReactiveCommand<Unit, Unit> CopySelectedItems { get; }
 
        public MainWindowViewModel()
        {
            CopySelectedItems = ReactiveCommand.CreateFromTask(CopySelectedItemsToClipboard);
 
        }
 
        public async Task CopySelectedItemsToClipboard()
        {
            string seleсtedText = string.Join(",", SelectedItems);
            var clipboard = Application.Current.Clipboard;
            await clipboard.SetTextAsync(seleсtedText);
        }
    }
Добавлено через 13 минут
Цитата Сообщение от limeniye Посмотреть сообщение
То есть как понял, при выделении строк, строки автоматически попадают в буфер обмена для того, чтобы потом можно было их куда-то вставить, например в Excel, или текстовый документ.
правильно поняли
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
05.02.2022, 16:01  [ТС]
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<ListBox Items="{Binding Items}" SelectedItems="{Binding SelectedItems}" SelectionMode="Multiple" Grid.IsSharedSizeScope="True">
        <ListBox.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Копировать" Command="{Binding CopySelectedItems}" />
            </ContextMenu>
        </ListBox.ContextMenu>
        
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <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>
Получается ,что при таком варианте перестало работать контекстное меню, при выделении строки выдается сообщение:
(см. во вложении)
Миниатюры
Avalonia (отображение списка строк)  
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
05.02.2022, 16:07
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">
                                    <TextBlock Text="{Binding Number}" Width="100"/>
                                    <TextBlock Text="{Binding Name}"  Width="100"/>
                                    <TextBlock Text="{Binding Value}" Width="100"/>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    public class MainWindowViewModel : ViewModelBase
    {
        private int _selectedTabIndex;
 
        public int SelectedTabIndex
        {
            get => _selectedTabIndex;
            set => this.RaiseAndSetIfChanged(ref _selectedTabIndex, value);
        }
 
        public ReactiveCommand<Unit, Unit> DoTheThing { get; }
        public ReactiveCommand<Unit, Unit> CopySelectedItems { get; }
 
        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"}
        };
        public ObservableCollection<Document> SelectedItems { get; set; } = new ObservableCollection<Document>();
 
        private readonly ObservableAsPropertyHelper<string> _selectedItemsAsText;
        public string SelectedItemsAsText => _selectedItemsAsText.Value;
 
        public MainWindowViewModel()
        {
            DoTheThing = ReactiveCommand.Create(RunTheThing);
            CopySelectedItems = ReactiveCommand.CreateFromTask(CopySelectedItemsToClipboard);
 
            _selectedItemsAsText = SelectedItems
                .ToObservableChangeSet()
                .ToCollection()
                .Select(x => string.Join(" ", x.Select(objToString => objToString.ToString())))
                .ToProperty(this, x => x.SelectedItemsAsText);
        }
 
 
        void RunTheThing()
        {
            SelectedTabIndex = 1;
        }
 
        async Task CopySelectedItemsToClipboard()
        {
            string seleсtedText = string.Join(",", SelectedItems);
            var clipboard = Application.Current.Clipboard;
            await clipboard.SetTextAsync(seleсtedText);
        }
    }
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
#if DEBUG
            this.AttachDevTools();
#endif
            DataContext = new MainWindowViewModel();
        }
 
        private void InitializeComponent()
        {
            AvaloniaXamlLoader.Load(this);
        }
    }
Добавлено через 2 минуты
Пока оставьте Avalonia. Данные, которые нужно закинуть в буфер обмена, у Вас есть. А вот закинуть данные в буффер обмена -- такой реализации у Вас нет.

Создайте отдельную тему в разделе C# для начинающих. И на примере консольного проекта добейтесь результата, чтобы у Вас какие-то данные копировались в буфер обмена, а потом возвращайтесь к этой теме.

Вам нужно сохранить в бефер обмена какую-то фразу, например "HelloWorld", но не черех Ctrl + C, а програмно.

Не по теме:

В идеале -- после создания темы, отправьте на неё ссылку в личные сообщения.

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
05.02.2022, 16:23
Цитата Сообщение от limeniye Посмотреть сообщение
Вам нужно сохранить в бефер обмена какую-то фразу, например "HelloWorld"
Sun1212, лаже не просто фразу, а коллекцию строк string[] или string[][].
Вам же нужно не в одну ячейку скопировать, а в диапазон (Range).
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
05.02.2022, 16:31  [ТС]
Цитата Сообщение от limeniye Посмотреть сообщение
закинуть данные в буффер обмена -- такой реализации у Вас нет.
Есть вариант вот такой реализации:

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 MainWindowViewModel : ViewModelBase
    {
 
        public ObservableCollection<string> Items { get; set; } = new ObservableCollection<string> { "Название документа", "Название, Номер, Значение", "А1,\t\t\ 0,01, 2,1e+002" };
 
        public ObservableCollection<string> SelectedItems { get; set; } = new ObservableCollection<string>();
 
      
        public ReactiveCommand<Unit, Unit> CopySelectedItems { get; }
 
 
        public MainWindowViewModel()
        {
            CopySelectedItems = ReactiveCommand.CreateFromTask(CopySelectedItemsToClipboard);
        }
 
        public async Task CopySelectedItemsToClipboard()
        {
            string seleсtedText = string.Join(",", SelectedItems);
            var clipboard = Application.Current.Clipboard; // буфер обмена
            await clipboard.SetTextAsync(seleсtedText);
        }
    }
}
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="Копировать" Command="{Binding $parent[ListBox].DataContext.CopySelectedItems}"/>
                            </ContextMenu>
                        </TextBlock.ContextMenu>
                    </TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
05.02.2022, 16:40
Элд Хасп, уж с этим, ладно, я сам разбирусь. В моих интересах, чтобы ТС хотябы попытался

Добавлено через 8 минут
Sun1212, clipboard, исходя из названия — это копирование по границам окна, как я полагаю, или что-то в этом роде.

Как я уже и сказал Выше, на данном этапе Avalonia нужно отложить.
Буфер обмена — это работа с какими-то участком оперативной памяти. Будь то Avalonia, или консольный проект — разницы нет. Но для примера, чтобы было легче и понятней, я советую использовать именно консольный проект, а код, потом, можно будет просто перенести.
1
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
07.02.2022, 21:13  [ТС]
Скажите, пожалуйста, в MainWindowViewModel в коллекцию Items добавила табуляцию:

C#
1
 public ObservableCollection<string> Items { get; set; } = new ObservableCollection<string> { "Название, Номер, Значение", "А1,\t\t\t 0,01,\t\t 2,1e+002" };
получилось - в ListBox отображение списка выглядит следующим образом: cм. вложение.

Можно как то убрать черные прямоугольники?
Миниатюры
Avalonia (отображение списка строк)  
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
07.02.2022, 21:16
Sun1212, честно сказать -- не знаю можно ли их убрать, ибо использование спец. символов в данном случае неуместно.
Но тут же встречный вопрос: а что с этим способом не так https://www.cyberforum.ru/wpf-... st16045159 ?
0
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
07.02.2022, 21:24  [ТС]
limeniye, способ хороший, данные отображаются как надо в форме таблицы, единственная проблема - не работает контекстное меню. У вас оно работает?
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
07.02.2022, 21:28

М?
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
07.02.2022, 21:35
Оставлю архив
AvaloniaApplication1.7z
2
0 / 0 / 0
Регистрация: 12.12.2021
Сообщений: 205
07.02.2022, 21:46  [ТС]
limeniye, спасибо большое! Всё работает!
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
07.02.2022, 21:50
Цитата Сообщение от Sun1212 Посмотреть сообщение
Всё работает!

Не по теме:

Sun1212, ещё бы )



Какие-то вопросы? Задавайте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2022, 21:50

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
99
Ответ Создать тему
Новые блоги и статьи
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru