Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
WPF

Модальное Окно для выбора операции с файлами без зависаний при выполнении цикла

30.03.2021, 15:31. Показов 4956. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
К слову и весь вопрос. Как можно передать окну которое будет находятся в другом потоке главное окно.
Окно будет запускать через отдельный класс который и будет создавать второстепенное окно в другом потоке.
Хотя вот функция которая вызывает окно:
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
private CheckBox templateCheckBox(string text)
        {
            return new CheckBox
            {
                Margin = new Thickness(8),
                VerticalAlignment = VerticalAlignment.Top,
                HorizontalContentAlignment = HorizontalAlignment.Center,
                VerticalContentAlignment = VerticalAlignment.Center,
                Style = (Style)Resources["StyleCheckBox"],
                Content = text
            };
        }
 
        public bool? ShowDialogControlSave(MainWindow mainWindow, string caption, int selectIndexSave = 0, int selectIndexOperation = 0)
        {
            this.Owner = mainWindow;
 
            this.Title = caption;
 
            this.Width = mainWindow.Width - 10;
            this.Height = mainWindow.Height - 10;
 
            this.WindowStartupLocation = WindowStartupLocation.CenterOwner;
 
            System.IO.Directory.GetFiles(SGeneral.settings.pathSaves, "*.map").ToList().ForEach(x =>
            {
                listSaves.Items.Add(templateCheckBox(System.IO.Path.GetFileName(x)));
            });
 
            if (selectIndexSave < listSaves.Items.Count)
                listSaves.SelectedIndex = selectIndexSave;
 
            switch (selectIndexOperation)
            {
                case 0:
                    rbtnOpenInSaveEditor.IsChecked = true;
                    break;
                case 1:
                    rbtnOpenInHexEditor.IsChecked = true;
                    break;
                case 2:
                    rbtnUncompressingSaves.IsChecked = true;
                    break;
                case 3:
                    rbtnCreateArchive.IsChecked = true;
                    break;
            }
 
            return this.ShowDialog();
        }
Но создание этого окна будет происходить в другом потоке.
Хотя не знаю как сделать грамотно. Само окно подразумивает выбор файлов и выбор операции что с ними делать.
Но сама функция System.IO.Directory.GetFiles и ForEach может продлится весьма долгое время а это не должно приводить к зависанию программы.
С другой стороны это окно модальное а значит когда оно отобразится переключатся на главное должно быть невозможным что уже говорит о том что модальное окно должно быть в потоке где и главное окно.
Подскажите как быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.03.2021, 15:31
Ответы с готовыми решениями:

Длительные операции без зависаний
У меня есть участки кода, которые выполняются длительное время. Я хочу вывести пользователю отдельное окошко, в котором написать...

Как реализовать экран загрузки (без фризов) при выполнении программой долгого цикла?
3) Как реализовать экран загрузки (без фризов) при выполнении программой долгого цикла? Delphi XE5

Модальное окно Query с кнопками выбора
Добрый день, товарищи. Нужно получить диалоговое окно по клику на кнопке, внутри окна текст и две кнопки. В зависимости от выбора...

61
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
06.04.2021, 09:16  [ТС]
Студворк — интернет-сервис помощи студентам
К томуже не могу прекрутить
XML
1
{Binding Converter={x:Static local:FileInfoToNameConverter.Instance}}
Получаю:
Code
1
2
Серьезность  Код  Описание    Проект    Файл    Строка    Состояние подавления
Ошибка    XDG0008 Имя "FileInfoToNameConverter" не существует в пространстве имен "clr-namespace:Eador_M_of_the_B_W_Launcher".    Eador_M_of_the_B_W_Launcher S:\Projects\C#\WPF\.NET\.NET Framework\Eador_M_of_the_B_W_Launcher\WindowArchive.xaml   24
Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Где и как вы задаёте контекст Данных?
Похоже вы ни как его не используете и из из этого основная куча ваших проблем.
Основной инструмент в WPF для получения данных UI элементами - это Контекст Данных и Привязки к нему.
Это требует ОБЯЗАТЕЛЬНОГО освоения.
Code Behind Окна, вообще, даже не открывайте.
Он должен оставаться пустым.
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using WK.Libraries.BetterFolderBrowserNS;
using System.Text.Json;
using System.Collections.ObjectModel;
 
namespace Eador_M_of_the_B_W_Launcher
{
   static class SGeneral
   {
        public static string pathProg;
 
        public static string fileName;
 
        public static FileManager fileManager;
 
        public static Settings settings;
 
        public static ObservableCollection<FileInfo> saveFiles;
 
        public static bool Start()
        {
            pathProg = System.IO.Directory.GetCurrentDirectory();
            fileName = @"\Settings.json";
 
            saveFiles = new ObservableCollection<FileInfo>();
 
            fileManager = new FileManager();
 
            settings = new Settings
            {
                reSetSettings = true,
 
                hexEditorFile = "",
                fileNameGame = "",
                pathSaves = "",
                saveAstral = "",
                saveOskolok = ""
            };
 
            return LoadSetting(pathProg + fileName);
        }
 
        public static bool LoadSetting(string _filename)
        {
            if (!File.Exists(_filename)) 
            {
                if (SetSettings())
                {
                    ReSaveFiles();
                    return true;
                }
                else
                    return false;
            }
 
            try
            {
                settings = JsonSerializer.Deserialize<Settings>(File.ReadAllText(_filename), new JsonSerializerOptions { IgnoreNullValues = true });
                if (settings.reSetSettings)
                    SetSettings();
 
                ReSaveFiles();
 
                return true;
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message, "Ошибка чтения", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
                return false;
            }
        }
 
        public static bool ReSaveFiles()
        {
            if (!Directory.Exists(settings.pathSaves)) return false;
 
            try
            {
                var dirInfos = new DirectoryInfo(settings.pathSaves);
                saveFiles.Clear();
                foreach (var fi in dirInfos.GetFiles("*.map"))
                    saveFiles.Add(fi);
                return true;
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message, "Ошибка добавления данных", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
                return false;
            }
        }
 
        public static bool SetSettings()
        {
            settings.reSetSettings = false;
 
            OpenFileDialog openFileDialog = new OpenFileDialog 
            {
                Multiselect = false,
                ValidateNames = true,
                CheckFileExists = true,
                CheckPathExists = true,
                DereferenceLinks = true,
            };
 
            openFileDialog.Filter = "launcher.exe|launcher.exe";
            openFileDialog.DefaultExt = "launcher.exe";
            openFileDialog.Title = "Выберите launcher.exe в папке с игрой";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    settings.fileNameGame = openFileDialog.FileName;
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            var betterFolderBrowser = new BetterFolderBrowser 
            {
                Multiselect = false,
                RootFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
                Title = "Выберите папку с сохранениями"
            };
 
            if (betterFolderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if (Directory.Exists(betterFolderBrowser.SelectedFolder))
                    settings.pathSaves = betterFolderBrowser.SelectedFolder;
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            openFileDialog.Filter = "Сохранение(*.map)|*.map";
            openFileDialog.DefaultExt = "*.map";
            openFileDialog.Title = "Выберите постоянное сохранение с данными осколка";
            openFileDialog.InitialDirectory = settings.pathSaves;
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    settings.saveOskolok = $@"\{Path.GetFileName(openFileDialog.FileName)}";
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            openFileDialog.Title = "Выберите постоянное сохранение с данными Астрала";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    settings.saveAstral = $@"\{Path.GetFileName(openFileDialog.FileName)}";
                else
                    return false;
            }
            else
            {
                return false;
            }
 
            openFileDialog.Filter = "HEX Редактор(*.exe)|*.exe";
            openFileDialog.DefaultExt = "*.exe";
            openFileDialog.Title = "Выберите hex редактор для редактирование сохранений вручную";
 
            if (openFileDialog.ShowDialog() == true)
            {
                if (File.Exists(openFileDialog.FileName))
                    settings.hexEditorFile = openFileDialog.FileName;
                else
                    settings.hexEditorFile = null;
            }
 
            return SaveSetting(pathProg + fileName);
        }
 
        public static bool SaveSetting(string _filename)
        {
            try
            {
                File.WriteAllText(_filename, JsonSerializer.Serialize(settings, new JsonSerializerOptions { WriteIndented = true, IgnoreNullValues = true }));
                return true;
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show(ex.Message, "Ошибка чтения", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error);
                return false;
            }
        }
    }
}
Это статический класс с данными использующихся в приложении в не зависимости от формы
В данном случае saveFiles находится здесь.
Как уже сказал что файлы изначально неизвостно и их получение происходит в коде через вызов LoadSetting
Запускается цепочка событий которая в зависимости от результата приведет к созданиюсписка или закрытию программы.

Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
31-я строка
ОХ БЛИН. Я же сказал что выделятся элемент ДОЛЖЕН 1 но галдочки должна быть возможность ставить все.
Это работает если выставить в Mode OneWayToSource но как уже сказал работает все это дело не удобно. Нужно чтобы при выделении элемента галочка автоматически не выбиралась а выбиралась примерно также как в WinForms либо по нажатию на саму галку либо при двойном нажатии по Item'у

Добавлено через 3 минуты
К томуже при OneWayToSource если галочку снимать то элемент не выделяется. Галдочки не должны быть связаны с выделением Item'а от слова совсем.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.04.2021, 10:11
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Получаю:
Если пространства имён заданы правильно, то после сборки ошибка должна исчезнуть.

Добавлено через 2 минуты
В моём примере конвертер находится в пространстве SelectFilesDialog.
У вас local: указывает на пространство Eador_M_of_the_B_W_Launcher.
Вы поменяли в конвертере?

Добавлено через 3 минуты
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Это статический класс с данными использующихся в приложении в не зависимости от формы
Статический класс - чаще всего это плохое решение.
WPF плохо работает с ними.
Только если надо получить статическое, немутабельное значение.
Как в моём конвертере статическое свойство с экземпляром:
C#
23
        public static FileInfoToNameConverter Instance { get; } = new FileInfoToNameConverter();
Добавлено через 6 минут
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
ОХ БЛИН. Я же сказал что выделятся элемент ДОЛЖЕН 1 но галдочки должна быть возможность ставить все.
Если разделять выделение и "галочки", то придётся задавать к чему эти галочки привязаны.
Следовательно для элемента коллекции, нужен тип с дополнительным свойством для этой галочки.
Делать это всё без нормальной ViewModel - будет большая дурно пахнущая куча.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
06.04.2021, 10:34  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если разделять выделение и "галочки", то придётся задавать к чему эти галочки привязаны.
Следовательно для элемента коллекции, нужен тип с дополнительным свойством для этой галочки.
Делать это всё без нормальной ViewModel - будет большая дурно пахнущая куча.
Галочка должна отностся к CheckBox'у но не к списку. Нужно поведение аналогично в CheckedListBox из WinForms я WPF кстати решил юзать только из за того что нужен свой стиль CheckedListBox своим стилдем. А точнее флажки своего стиля.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Статический класс - чаще всего это плохое решение.
WPF плохо работает с ними.
Только если надо получить статическое, немутабельное значение.
Как в моём конвертере статическое свойство с экземпляром:
Ну статический класс чтобы его не нукжно было создавать и обращатся к нему можно быдло из любого класа. Это вся причина чтобы с данными можно было работать из одной и другой формы.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если пространства имён заданы правильно, то после сборки ошибка должна исчезнуть.
Не знаю но как уже сказал в XAML указываю не видит. Хотя я не компилировал но мне сам C# с ошибкой не даст скомпелировать всеже это синтаксическая ошибка а не предупреждение.
Я так пологаю FileInfoToNameConverter это отдельная свойство и нужно пилить свой класс наследника от FileInfo?
Повторяю мне нужна добится аналогии с CheckedListBox'ом из WinForms. Но со своим счтилем и количество элементов в списке зависит от количества файлов в списке а контент имя файцла юбез его расширения.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.04.2021, 13:56
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Галочка должна отностся к CheckBox'у но не к списку.
Нет!
Это ваше виденье реализации и оно для WPF неверно.
CheckBox - это UI элемент.
И его задача ПРЕДСТАВЛЯТЬ данные, а не быть источником данных.
Если вам нужен какой-то признак выбора элемента коллекции, то это и должно быть реализовано на уровне элемента коллекции, а не на уровне его отображения.

В WPF логическое дерево, визуальное дерево, наследование Контекста Данных очень сильно отличаются друг от друга.
И, в принципе, можно в шаблоне данных для string задать CheckBox, но вот потом "добраться до него" чтобы определить какой из них выбран - задача весьма нетривиальная.
И вам она точно не по плечу.
Да и не нужно это в вашей задаче, только лишнее усложнение там где ему нет места.

Добавлено через 4 минуты
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ну статический класс чтобы его не нукжно было создавать и обращатся к нему можно быдло из любого класа.
Вы упрощаете в одно (там где это не так и нужно), но усложняете во многих других местах.
Ещё раз пишу: WPF очень плохо работает со статическими классами.
Туже привязку задать к нему - далеко не так просто.

Так же в отношении вашей реализации этого класса: в современном Шарпе не используются Публичные поля. В редких случаях допускается использовать публичные поля ТОЛЬКО ДЛЯ ЧТЕНИЯ.

Добавлено через 4 минуты
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Не знаю но как уже сказал в XAML указываю не видит. Хотя я не компилировал но мне сам C# с ошибкой не даст скомпелировать всеже это синтаксическая ошибка а не предупреждение.
Ещё раз вопрос о пространстве имён:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы поменяли в конвертере?
Вы его вставили полностью как я дал код?
Или внесли в него изменения под ваш проект?
Для вашего проекта в локальном пространстве должно быть так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
using System;
using System.Globalization;
using System.IO;
using System.Windows;
using System.Windows.Data;
 
// Вот это называется пространством имён.
// И оно должно быть указанно правильно!
namespace  /* SelectFilesDialog */ Eador_M_of_the_B_W_Launcher
{
    public class FileInfoToNameConverter : IValueConverter
    {
Добавлено через 2 минуты
И после внесения изменений в Шарп код, проект надо обязательно СОБИРАТЬ!
XAML Дизайнер берёт информацию из СБОРКИ, а не из проекта.

Добавлено через 1 минуту
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Повторяю мне нужна добится аналогии с CheckedListBox'ом из WinForms.
Вы можете добиваться чего угодно - это ваше право.
А можете решать задачу, а не выдумывать себе искусственные сложности.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
06.04.2021, 16:26  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы можете добиваться чего угодно - это ваше право.
А можете решать задачу, а не выдумывать себе искусственные сложности.
Какие блин сложности. Реализация ваша работает по идиотски. Сказал же выделение элемента в списке должно быть отдельно. Ставить галочку на элементе должно быть отдельно. Также как и в элементе CheckedListBox из WinForms
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вы его вставили полностью как я дал код?
Или внесли в него изменения под ваш проект?
Для вашего проекта в локальном пространстве должно быть так:
Я ниче блин не вставлял. Я блинг уже скинул код где список с файлами находиться. Пишу 3 РАЗ:

Выделенная строка это и есть нужный элемент. Если его указать через XAML то в итоге список пустой. Если указать через код. Список не пустой.
И как уже посмотрел нет возможности получить у FileInfo файл без расширение. Чтобы получить прийдется добавлять класс наследник и писать свойство получения имени файла но в принципе не сильно сложно.
Ваш код я не реализовал так как там черти что а не то что мне нужно. И повторюсь. Мне нужно чтобы выбирания элемента в списке вообще не как не влияло на выбор галочку так как ЭТО НЕУДОБНО.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
06.04.2021, 17:09  [ТС]
Блин. WPF какойто звиздец. На кой хрен было делать чтобы выдиление CheckedBox в списке обязательнео ставил галочку. И на оборот если ты убераешь галочку то элемент не выделяется. Мне объеденить нужен список CheckBoxjd а это какойто аналог списка радиокнопок получается вот что совсем не нужно

Добавлено через 25 минут
Понял почему не работает. Выбор выделение назначен на правую кнопку мыши что нужно перенаправить на левую кнопку мыши.

Добавлено через 4 минуты
Короче думаю найдутся люди которые знают как список в wpf Сделать аналогичным списку CheckedListBox из WinForms

Добавлено через 9 минут
И еще раз повторяю что выделятся строка в списке должна только одна так что свойство SelectionMode="Multiple" уже отпадает при этом сам список должен быть списком CheckBox'ов а не списком радиокнопок в стилистике CheckBox'ов
0
1596 / 601 / 185
Регистрация: 05.12.2015
Сообщений: 970
06.04.2021, 17:18
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Короче думаю
сделай шаблон раздельно - для checkbox и textblock.
тогда нажимается и выделяется все по отдельности
XML
1
2
3
4
5
6
  <DataTemplate DataType="{x:Type vm:MyText}">
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsChecked}" VerticalAlignment="Center" Margin="2"/>
                <TextBlock Text="{Binding Text}"/>
            </StackPanel>
        </DataTemplate>
не знаю как у тебя, но можно привести к чему угодно.
если что выложи проект решения.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
06.04.2021, 18:24
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Короче думаю найдутся люди которые знают как список в wpf Сделать аналогичным списку CheckedListBox из WinForms
Поождём,.
Мне тоже интересно что произойдёт быстрее: кто-то заморочится и под вас сделает готовую реализацию, или вы поймёте, что с WPF нельзя работать такими же костылями как в Формах.

Добавлено через 1 минуту
proa33, ТС даже слышать не хочет чтобы создать свой тип со свойством для выделения элемента.
Я уже ему это предлагал.
Ему надо CheckedListBox из Форм и без вариантов.
1
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
07.04.2021, 14:22  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Поождём,.
Мне тоже интересно что произойдёт быстрее: кто-то заморочится и под вас сделает готовую реализацию, или вы поймёте, что с WPF нельзя работать такими же костылями как в Формах.
Ну вообще можно через костыли. На обработчик нажатия левой кнопки мыши в списке сделать изменение выделения строки. Костыли но способ будет работать правдо галочка все равно будет ставиться на левую кнопку мыши что конечно не очень костыли но проблемы не решает.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
proa33, ТС даже слышать не хочет чтобы создать свой тип со свойством для выделения элемента.
Я уже ему это предлагал.
Ему надо CheckedListBox из Форм и без вариантов.
Я не увидел где вы это предлагали. Вы мне вообще советовали так не делать вроде. Извиняюсь может и пропустил чего.
Цитата Сообщение от proa33 Посмотреть сообщение
сделай шаблон раздельно - для checkbox и textblock.
тогда нажимается и выделяется все по отдельности
Знать бы еще как. Я вообще XAML впервые можно сказать изучаю. Да не сложно но я если честно говоря терпеть не могу XAML и CSS и HTML короче всме что связано с языками разработки сайтов а тут похожая ситуация. Но я не могу не отрицать что WPF гораздо гибче чем WinForms и много чего позволяет когда как в WinForms будь добр разрабатывай с нуля.

Добавлено через 4 минуты
Цитата Сообщение от proa33 Посмотреть сообщение
не знаю как у тебя, но можно привести к чему угодно.
если что выложи проект решения.
Ну вот стиль самого CheckBox'а
XML
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    <Style x:Key="OptionMarkFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="14,0,0,0" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
 
    <SolidColorBrush x:Key="OptionMark.MouseOver.Background" Color="#FFF3F9FF"/>
    <SolidColorBrush x:Key="OptionMark.MouseOver.Border" Color="#FF5593FF"/>
    <SolidColorBrush x:Key="OptionMark.Disabled.Background" Color="#FFE6E6E6"/>
    <SolidColorBrush x:Key="OptionMark.Disabled.Border" Color="#FFBCBCBC"/>
    <SolidColorBrush x:Key="OptionMark.Pressed.Background" Color="#FFD9ECFF"/>
    <SolidColorBrush x:Key="OptionMark.Pressed.Border" Color="#FF3C77DD"/>
 
    <BitmapImage x:Key="Image.Checked" UriSource="/./Resources/Checked.png"/>
    <BitmapImage x:Key="Image.Unchecked" UriSource="/./Resources/Unchecked.png"/>
    <BitmapImage x:Key="Image.Null" UriSource="/./Resources/Indeterminate.png"/>
 
    <Style x:Key="StyleCheckBox" TargetType="CheckBox" >
        <Setter Property="MinHeight" Value="36" />
        <Setter Property="Cursor" Value="Hand" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="CheckBox">
                    <Grid x:Name="templateRoot" Background="Transparent">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid Grid.Column="0">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Border x:Name="checkBoxBorder" Grid.Column="1" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="1" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                                <Grid x:Name="markGrid">
                                    <Image x:Name="checkChecked" Source="{DynamicResource Image.Null}" Margin="1" Opacity="1" Stretch="None" />
                                </Grid>
                            </Border>
                        </Grid>
                        <Grid Grid.Column="1">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="auto"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <ContentPresenter x:Name="contentPresenter" Grid.Row="1" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Grid>
                    </Grid>
 
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasContent" Value="true">
                            <Setter Property="FocusVisualStyle" Value="{StaticResource OptionMarkFocusVisual}"/>
                            <Setter Property="Padding" Value="4,-1,0,0"/>
                        </Trigger>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter Property="Background" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.MouseOver.Background}"/>
                            <Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.MouseOver.Border}"/>
                            <Setter Property="TextBlock.FontWeight" TargetName="contentPresenter" Value="Bold"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Background" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Disabled.Background}"/>
                            <Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Disabled.Border}"/>
                            <Setter Property="Opacity" TargetName="checkChecked" Value="0.5" />
                        </Trigger>
                        <Trigger Property="IsPressed" Value="true">
                            <Setter Property="Background" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Pressed.Background}"/>
                            <Setter Property="BorderBrush" TargetName="checkBoxBorder" Value="{StaticResource OptionMark.Pressed.Border}"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="False">
                            <Setter Property="Source" TargetName="checkChecked" Value="{DynamicResource Image.Unchecked}"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter Property="Source" TargetName="checkChecked" Value="{DynamicResource Image.Checked}"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="{x:Null}">
                            <Setter Property="Source" TargetName="checkChecked" Value="{DynamicResource Image.Null}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
В идеале нужно отдельный элемент разработать но чет не разобрался в этом деле да и мне это не нужно. Просто удобства.
Но разделять CheckBox и TextBlock я так понял здесь или где?
А вообще вот окно:
XML
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
<Window x:Class="Eador_M_of_the_B_W_Launcher.WindowArchive"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:io="clr-namespace:System.IO;assembly=mscorlib"
        xmlns:local="clr-namespace:Eador_M_of_the_B_W_Launcher"
        mc:Ignorable="d"
        Title="WindowArchive" Height="720" Width="640" FontFamily="Segoe UI" FontSize="24" >
    <Grid Margin="8">
        <Grid.RowDefinitions>
            <RowDefinition Height="24" />
            <RowDefinition Height="8" />
            <RowDefinition Height="*" />
            <RowDefinition Height="8" />
            <RowDefinition Height="auto" />
            <RowDefinition Height="8" />
            <RowDefinition Height="32" />
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20" Text="Выберите сохранение:" />
        <ListBox x:Name="listSaves" Grid.Row="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" 
                 VerticalContentAlignment="Top" >
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type io:FileInfo}">
                    <CheckBox Content="{Binding Name}" VerticalAlignment="Top" Padding="8"
                              HorizontalContentAlignment="Center" VerticalContentAlignment="Center" FontSize="12"
                              IsChecked="{Binding IsSelected}"
                              Style="{StaticResource StyleCheckBox}" />
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ListBox>
        <StackPanel Grid.Row="4">
            <RadioButton x:Name="rbtnOpenInSaveEditor" VerticalAlignment="Top" HorizontalAlignment="Stretch" 
                    HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Расшифровать / Открыть выделенное сохранение в редакторе сохранений"
                    FontSize="12" Height="32" IsChecked="True" Cursor="Hand" />
            <RadioButton x:Name="rbtnOpenInHexEditor" VerticalAlignment="Top" HorizontalAlignment="Stretch" 
                    HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Открыть выделенное сохранение в hex редакторе"
                    FontSize="12" Height="32" Margin="0,8,0,0" Cursor="Hand" />
            <RadioButton x:Name="rbtnUncompressingSaves" VerticalAlignment="Top" HorizontalAlignment="Stretch" 
                    HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Расшифровать выбранные сохранения"
                    FontSize="12" Height="32" Margin="0,8,0,0" Cursor="Hand" />
            <RadioButton x:Name="rbtnCreateArchive" VerticalAlignment="Top" HorizontalAlignment="Stretch" 
                    HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Создать архив с выбранными сохранениями"
                    FontSize="12" Height="32" Margin="0,8,0,0" Cursor="Hand" />
        </StackPanel>
        <Grid Grid.Row="6" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="12" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>
            <Button x:Name="btnOk" Grid.Column="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
                    HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="ОК" IsDefault="True" 
                    Style="{StaticResource StyleFlatButton}" Click="btnOk_Click" />
            <Button x:Name="btnCancel" Grid.Column="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
                    HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="Отмена" 
                    Style="{StaticResource StyleFlatButton}" Click="btnCancel_Click" />
        </Grid>
    </Grid>
</Window>
Сам список задаю через код ибо как уже говорил xaml его не видит.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.04.2021, 14:39
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Я не увидел где вы это предлагали. Вы мне вообще советовали так не делать вроде. Извиняюсь может и пропустил чего.
Мои извинения!


Похоже это я темы перепутал.

Суть решения: делаете простейший класс со свойством для выделение:
C#
1
2
3
4
5
6
7
8
9
10
public class FileInfoVM : BaseInps
{
    public FileInfoVM(FileInfo fileInfo)
       => FileInfo = fileInfo;
 
   public FileInfo FileInfo {get;}
 
   private bool _isSelected;
   public bool IsSelected {get => _isSelected; set => Set(ref _isSelected, value);}
}
Массив файлов из метода DirectoryInfo.GetFiles() преобразуете в коллекцию ObservableCollection<FileInfoVM> находящуюся в свойстве Files ViewModel.

VM передаёте или создаёте в Контексте Данных Окна.

И ListBox с привязкой к этой коллекции:
XML
30
31
32
33
34
35
36
37
<ListBox ItemsSource="{Binding Files}">
    <ListBox.ItemTemplate>
         <DataTemplate DataType="{x:Type ***:FileInfoVM}">
              <CheckBox IsChecked="{Binding IsSelected}"
                         Content="{Binding FileInfo.Name}"/>
         </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
В команде кнопки (начала обработки) просматриваете коллекцию Files и выбираете из неё элементы у которых установлен флаг IsSelected.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
07.04.2021, 14:43  [ТС]
Толи вы меня не понимаете толи я вас.
Да в принципе вот решение проблемы:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<ListBox x:Name="listSaves" Grid.Row="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" 
                 VerticalContentAlignment="Top" >
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type io:FileInfo}">
                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Top">
                        <CheckBox HorizontalAlignment="Left"
                              IsChecked="{Binding IsSelected}"
                              Style="{StaticResource StyleCheckBox}" />
                        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" FontSize="12" Text="{Binding Name}" />
                    </StackPanel>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ListBox>
Как и написали выше это разделить галочку и TextBlock но вот одно пока не могу решить. Текст должен быть по центру. Он конечно по центру но он не занимает всю область длинны списка.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.04.2021, 14:43
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
А вообще вот окно:
Очень сильно смущает наличие имён у UI элементов.
В WPF они задаются в редких случаях.
Для привязок типа ElementName, анимации и сеттеров в триггерах.
Больше даже не припомню для чего их можно задавать.
Вы же их явно не для этого задаёте - и следовательно что-то делаете неправильно.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
07.04.2021, 14:48  [ТС]
А ваш пример до сих пор не могу понять. Нет код конечно мне ясен но не могу понять а зачем там делать свойство ыделения? Оно не нужно мне для списка файлов. Я все равно буду отдельный список создавать для выделенных файлов чтобы его сразу использовать.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Очень сильно смущает наличие имён у UI элементов.
В WPF они задаются в редких случаях.
Для привязок типа ElementName, анимации и сеттеров в триггерах.
Больше даже не припомню для чего их можно задавать.
Вы же их явно не для этого задаёте - и следовательно что-то делаете неправильно.
Имя я задаю чтобы использовать в коде. И для событий. Например кнопки ок и отмена должны вернуть модальной форме true или false. Если это можно сделать через XAML то пятьже я не знаю как это делается. Для меня Xaml в новинку.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.04.2021, 14:49
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Да в принципе вот решение проблемы:
Зачем вы используете StackPanel? если для вывода текста можно использовать CheckBox.Content?

Цитата Сообщение от Alexandr_7 Посмотреть сообщение
вот одно пока не могу решить. ТЬекст должен быть по центру.
Надо использовать Grid:
XML
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        <DataTemplate DataType="{x:Type io:FileInfo}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <CheckBox IsChecked="{Binding IsSelected}"
                          Style="{DynamicResource StyleCheckBox}" />
                <TextBlock Grid.Column="1"
                           HorizontalAlignment="Center"
                           VerticalAlignment="Center"
                           FontSize="12"
                           Text="{Binding Name}" />
            </Grid>
        </DataTemplate>
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
07.04.2021, 14:56  [ТС]
Для радиокнопок так яже через код должен к ним както обращаться чтобы вернуть какая операция выбрана. У списка можно и убрать но опятьже я говорил что xaml не видит список файлов его приходится указывать через код а следовательно и обращатся к списку тоже нужно.

Добавлено через 2 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Зачем вы используете StackPanel? если для вывода текста можно использовать CheckBox.Content?
Я блин кому распинаюсь тут отвечать что мне нужно чтобы выделение строки в списке и работа галочек в списке должно быть разделено также как в winforms вот почему я текст делаю отдельным элементом чтобы галочка не нажималась когда выбираешь строку!!!!!

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо использовать Grid:
Тьфу ты блин. А я ведь пробывал и не мог понять а почему не работает. Ясен пень я же Column с Row перепутал.

Добавлено через 1 минуту
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<ListBox x:Name="listSaves" Grid.Row="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" 
                 VerticalContentAlignment="Top" >
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type io:FileInfo}">
                    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Top">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <CheckBox Grid.Column="0" HorizontalAlignment="Left"
                              IsChecked="{Binding IsSelected}"
                              Style="{StaticResource StyleCheckBox}" />
                        <TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" FontSize="12" Text="{Binding Name}" />
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ListBox>
Вот теперь идеально.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.04.2021, 14:56
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Он конечно по центру но он не занимает всю область длинны списка.
Это задаётся в стиле элемента ListBox, а не в его шаблоне.
Или в свойстве для позиционирования контента:
XML
1
        <ListBox HorizontalContentAlignment="Stretch" ....>
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
07.04.2021, 14:57  [ТС]
Ну а для того чтобы убрать расширение прийдется класс отдельный делать и добавлять свойство. В принципе не сложно но пока трогать не буду. И так сойдет.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.04.2021, 15:02
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Нет код конечно мне ясен но не могу понять а зачем там делать свойство ыделения?
А к чему вы собираетесь привязывать IsChecked?
Его можно привязать либо к самому ListBoxItem, но вас такое решение не устраивает.
Либо к свойству элемента коллекции.
По другому получить значение IsChecked будет очень сложно.

Добавлено через 49 секунд
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Ну а для того чтобы убрать расширение прийдется класс отдельный делать и добавлять свойство.
Я же дел вам конвертер и показал как им пользоваться.
Он возвращает имя без расширения.

Добавлено через 2 минуты
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Для радиокнопок так яже через код должен к ним както обращаться чтобы вернуть какая операция выбрана.
Это всё делается через привязки в ViewModel.
Все данные хранятся в VM.
UI элементы их только Представляют (отображают в частности).
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,904
07.04.2021, 15:15  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
А к чему вы собираетесь привязывать IsChecked?
Его можно привязать либо к самому ListBoxItem, но вас такое решение не устраивает.
Либо к свойству элемента коллекции.
По другому получить значение IsChecked будет очень сложно.
Да это уже я понял. Можно привязать и к ListBoxItem мне главное чтобы при выделении строки галочка никак не реагировала. Разве что на двойное нажатие или повторное нажатие если элемент уже выделен.
В принципе вот как я создаю список выделенных элементов:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public List<System.IO.FileInfo> idSelectsCheck
        {
            get 
            {
                var list = new List<System.IO.FileInfo>();
                for (var i= 0; i < listSaves.Items.Count; i++)
                {
                    var chBox = (CheckBox)listSaves.Items[i];
                    if (chBox.IsChecked == true)
                        list.Add(SGeneral.saveFiles[i]);
                }
                return list;
            }
        }
Но конечно работать не будет. Ибо нужно получить саму галочку.
Другое дело что свойство выделения с глобальным списком файлов будет лишним точнее оно не нужно глдобальным. Оно нужно только для модальной формы или надо всю идею продумывать по другому.

Добавлено через 5 минут
В принципе по идеи вот так должно работать:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public List<System.IO.FileInfo> idSelectsCheck
        {
            get 
            {
                var list = new List<System.IO.FileInfo>();
                for (var i= 0; i < listSaves.Items.Count; i++)
                {
                    var grd = (Grid)listSaves.Items[i];
                    var chBox = (CheckBox)grd.ColumnDefinitions[0].Parent;
                    if (chBox.IsChecked == true)
                        list.Add(SGeneral.saveFiles[i]);
                }
                return list;
            }
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,176
Записей в блоге: 2
07.04.2021, 15:28
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
В принципе по идеи вот так должно работать:
В принципе да, но это очень кривое решение, которое может в дальнейшем породить массу проблем.
Ещё раз пишу, в WPF Решении не должно быть обращения к UI элементам на Шарпе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2021, 15:28

Как сделать одно модальное окно для всех товаров без использования Джаваскрипта
Сейчас товары выводятся с модальным окном циклом http://wnero.esy.es/frontend/web/index.php?r=site/shop &lt;?php foreach...

Модальное окно без jQuery
Здравствуйте. Подскажите пожалуйста модальное окно без использования библиотек, таких как jQuery. Чтобы показать одно вспл. окно не гуд...

Есть модальное окно (без анимации)
Здравствуйте, есть у меня скрипт, который открывает модальное окно, но он открывает очень резко, что нужно добавить в код что бы...

Верстка без адаптации и модальное окно (photoSwip)
При зуме сайта нужно что бы модальное окно приложения photoSwipe открывалось по размерам текущего видимого окна. Добавление viewport не...

Окно с тремя метками и модальное окно для изменения их текста
Главное окно (фиксированного размера) содержит три метки. При щелчке на одной из меток появляется модальное окно с полем ввода и кнопками...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru