Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126

Как програмно добавить к чекбоксам еще один элемент (цветной прямоугольник)

09.05.2021, 06:34. Показов 2716. Ответов 8

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Помогите, пожалуйста добавить цветной прямоугольник к каждому чекбоксу создаваемому программно.
Вот так создаю чекбоксы:
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 partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            List<CheckBox> chackList = new List<CheckBox>();
            for (int i = 0; i < 3; i++)
            {
                CheckBox chack = new CheckBox();
                chackList.Add(chack);
                chackList[i].Width = 100;
                chackList[i].Height = 30;
                chackList[i].Margin = new Thickness(5, 20, 0, 0);
 
                chackList[i].Content = String.Format("Ch{0}", i);
                chackList[i].Name = String.Format("Ch{0}", i);
            }
            boxAll.ItemsSource = chackList;
        }
    }
На xaml просто листбокс и кнопка по которой должен заполняться этот листбокс:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Window x:Class="testListBox.MainWindow"
        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:local="clr-namespace:testListBox"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <ListBox Name="boxAll" HorizontalAlignment="Left" Height="264" Width="180" 
                 Margin="40,40,0,0" VerticalAlignment="Top" 
                 SelectionMode="Multiple" Background="Red"/>
        <Button Content="Button" HorizontalAlignment="Left" Margin="250,40,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    </Grid>
</Window>
Должно получится примерно так:
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.05.2021, 06:34
Ответы с готовыми решениями:

Кольцевая диаграмма PhP как добавить ещё один элемент?
Как добавить ещё один круг в круговую диаграмму, что бы из неё сделать кольцевую диаграмму? Не могу понять как это сделать так как дали...

В клипе есть еще один клип, как добавить в него элемент?
в клипе main уже есть клип -с известным именем &quot;drk&quot; однако данный код выдает ошибку: Обращение возможного неопределенного свойства tmm...

Нужно на 3D графике изобразить прямоугольник и чтоб к этому прямоугольнику был приставлен ещё один прямоугольник
Помогите пожалуйста с маткадом. Нужно на 3D графике изобразить прямоугольник и чтоб к этому прямоугольнику был приставлен ещё один...

8
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
09.05.2021, 08:56
Keramer82, учитесь правильно использовать WPF.

1) Code Behind Окна не принято использовать.
А пока не набрались опыта, вообще, файлы "*.xaml.cs" никогда даже не открывайте.

Добавлено через 1 минуту
2) Свойство Margin используется для задания расстояния между элементами, а не их позиции.
Позиция элемента обеспечивается компоновкой с использованием различных контейнеров - в основном панелей.

Добавлено через 1 минуту
3) Основной язык WPF - это XAML.
Создание ГШ элементов, обращение к ним, любые действия с ними должны быть только на XAML.
Не используйте Шарп для работы с UI элементами - от слова СОВСЕМ.

Добавлено через 2 минуты
4) На Шарпе нужно подготавливать данные, потом передавать их в Контекст Данных (DataContext), а в XAML задать Преставление (View) lrjnjhjt будет работать с данными через Привязки (Binding).
Контекст Данных обычно играет роль ViewModel.

Добавлено через 11 минут
5) Зачем вы используете ListBox?
Если вам нужно выделение элементов, то скорее всего нужно как-то связать CheckBox с выдлением строки.
А если выделение не нужно, то следует использовать ItemsControl.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
09.05.2021, 09:38
Лучший ответ Сообщение было отмечено Keramer82 как решение

Решение

Цитата Сообщение от Keramer82 Посмотреть сообщение
Как програмно добавить к чекбоксам еще один элемент (цветной прямоугольник)
Не "программно", атак как это делается в WPF.
Пример реализации.

Тип для данных одной строки:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ChekBoxList
{
    public class CheckBoxData
    {
        public bool IsSelected { get; set; }
        public object Content { get; set; }
        public object Background{ get; set; }
    }
}
ViewModel:
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
using Simplified;
using System;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
 
namespace ChekBoxList
{
    public class CheckBoxesViewModel
    {
        private RelayCommand _clickMeCommand;
 
        public ObservableCollection<CheckBoxData> CheckBoxes { get; }
            = new ObservableCollection<CheckBoxData>();
 
        public CheckBoxesViewModel()
        {
            string[] colors = { "Blue", "Green", "White" };
            for (int i = 0; i < 3; i++)
            {
                CheckBoxes.Add(
                    new CheckBoxData()
                    { 
                        Content = $"Ch{i}",
                        Background = colors[i % colors.Length]
                    });
            }
        }
 
        public RelayCommand ClickMeCommand => _clickMeCommand
            ?? (_clickMeCommand = new RelayCommand(ClickMeExecute, ClickMeCanExecute));
 
        private bool ClickMeCanExecute()
            => CheckBoxes.Any(cbd => cbd.IsSelected);
 
        private void ClickMeExecute()
            => MessageBox.Show(
                    string.Join(Environment.NewLine, CheckBoxes.Where(cbd => cbd.IsSelected).Select(cbd => $"{cbd.Content} - {cbd.Background}")),
                    "Выбранные элементы."
                );
    }
}
XAML Окна:
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
<Window x:Class="ChekBoxList.CheckBoxesWindow"
        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:local="clr-namespace:ChekBoxList"
        mc:Ignorable="d"
        Title="CheckBoxesWindow" Height="250" Width="200">
    <Window.DataContext>
        <local:CheckBoxesViewModel/>
    </Window.DataContext>
    <UniformGrid Columns="2">
        <ItemsControl Background="Red"
                      ItemsSource="{Binding CheckBoxes}"
                      HorizontalContentAlignment="Stretch">
            <ItemsControl.ItemTemplate>
                <DataTemplate DataType="{x:Type local:CheckBoxData}">
                    <CheckBox IsChecked="{Binding IsSelected}"
                              Margin="5,10"
                              HorizontalContentAlignment="Stretch">
                        <UniformGrid Columns="2">
                            <TextBlock Text="{Binding Content}"/>
                            <Rectangle Fill="{Binding Background}"/>
                        </UniformGrid>
                    </CheckBox>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
        <Button Content="Нажми меня!" HorizontalAlignment="Center"
                Margin="10" VerticalAlignment="Top" Padding="15 5"
                Command="{Binding ClickMeCommand}"/>
 
    </UniformGrid>
</Window>
Использованы базовые классы из Простые реализации для тем на форуме.
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
09.05.2021, 12:34  [ТС]
Элд Хасп, спасибо, что откликнулись, это моя первая программа на WPF. А можно ли сделать (как нельзя) как-то пока без ViewModel. Я пока просто еще не дошел до изучения этого, а хочется хоть что работающее (пусть криво косо), по новичковому? Потом уже можно будет взглянуть на свое "творение" и уже начинать пошаговое углубленное изучение.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
09.05.2021, 16:54
Цитата Сообщение от Keramer82 Посмотреть сообщение
Я пока просто еще не дошел до изучения этого, а хочется хоть что работающее (пусть криво косо), по новичковому?
Сразу пишу - не советую.
Работа на Шаре с UI элементами ничего в плане опыта вам не даст.
И WPF часто это намного сложнее чем в XAML.

Здесь следует поступать наоборот.
Сначала изучить как это делается на XAML с использованием Контекста Данных и Привязок.
А когда изучите, наберётесь опыта, поймёте как работать с логическим и визуальными деревьям сможет для сложных задач изучать как это реализовать на Шарпе.

Добавлено через 1 минуту
Конкретно в вашей задаче запишите в Контент CheckBox панель (в моём примере на XAML это UniformGrid), а уже в панель добавить дочерние элементы и скомпоновать их как вам нужно.
1
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
09.05.2021, 21:32  [ТС]
Сделал пока так (все равно это послужит лишь макетом для дальнейшего изучения), НО почему-то не работает прокрутка при переполнении
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                Color col = new Color();
                col = Color.FromArgb(255, 255, 0, 0);
                CheckBox[] CheckArray = new CheckBox[12];
                for (int i = 0; i < CheckArray.Length; i++)
                {
                    grid1.RowDefinitions.Add(new RowDefinition());
                    grid1.Background = new SolidColorBrush(col);
                    CheckArray[i] = new CheckBox();
 
                    CheckArray[i].Width = 100;
                    CheckArray[i].Height = 30;
                    CheckArray[i].Margin = new Thickness(5, 15, 0, 0);
                    CheckArray[i].IsChecked = true;
 
                    CheckArray[i].Content = String.Format("             ", i);
                    CheckArray[i].Name = String.Format("Color{0}", i);
                    grid1.Children.Add(CheckArray[i]);
                    Grid.SetRow(CheckArray[i], i);
                }
А если делаю так, то прокрутка работает, но нет заднего фона для прямоугольника
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                Color col = new Color();
                col = Color.FromArgb(255, 255, 0, 0);
                CheckBox[] CheckArray = new CheckBox[12];
                for (int i = 0; i < CheckArray.Length; i++)
                {
                    CheckArray[i] = new CheckBox();
                    CheckArray[i].Width = 100;
                    CheckArray[i].Height = 30;
                    CheckArray[i].Margin = new Thickness(5, 15, 0, 0);
                    CheckArray[i].Background = new SolidColorBrush(col);
                    CheckArray[i].IsChecked = true;
                    CheckArray[i].Content = String.Format("C{0}", i);
                    CheckArray[i].Name = String.Format("C{0}", i);
 
                    boxAll.Items.Add(CheckArray[i]);
                }
в xaml вроде все выставлено
XML
1
2
3
4
5
            <ListBox Name="boxAll" HorizontalAlignment="Left" Height="264" Width="180" 
                     Margin="916,124,0,0" VerticalAlignment="Top" Background="#FFC9C3A1" 
                     SelectionMode="Multiple" ScrollViewer.VerticalScrollBarVisibility="Visible">
                <Grid Name="grid1"/>
            </ListBox>
Почему так происходит? Как такое исправлять? Студия ни о чем не говорит, просто прокрутка не активна (в первом случае и все)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
10.05.2021, 07:49
Цитата Сообщение от Keramer82 Посмотреть сообщение
Почему так происходит? Как такое исправлять?
Мне "в лом" разбираться в этих Шарповских костылях.
Не вижу ни какого смысла в этом - совершенно бесполезный опыт.

Может кто другой захочет в это вникнуть.
0
4 / 2 / 3
Регистрация: 30.07.2019
Сообщений: 126
10.05.2021, 11:09  [ТС]
Проблему с прокруткой решил вставкой чекбоксов по второму способу, а у самих чекбоксов поменял внешний вид через стили. Живой макет программы доделаю, начну изучать углубленно и , чувствую, не один вопрос еще задам на форуме. Кто ж знал, что уроки по wpf надо смотреть с конца, т. к. информация про ViewModel во всех встреченных мной уроках для новичков идет в завершении?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,037
Записей в блоге: 2
10.05.2021, 12:22
Цитата Сообщение от Keramer82 Посмотреть сообщение
Кто ж знал, что уроки по wpf надо смотреть с конца, т. к. информация про ViewModel во всех встреченных мной уроках для новичков идет в завершении?
Согласен.
И я не раз уже писал об этом, что изначально учат неправильному коду, потом приходится весь накопленный опыт выбрасывать в корзину и переучиваться заново.
А это гораздо сложнее чем сразу учить правильно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2021, 12:22
Помогаю со студенческими работами здесь

Добавить в упорядоченный массив еще один элемент не нарушая упорядоченности
задача:в отсортированном массиве по возрастанию с 10 элементами добавить один дополнительный элемент так что-бы в новом массиве также...

Как добавить еще один столбец
В запросе нужно выбрать 10 наиболее часто используемых медикаментов, с этим кое как разобрался, но не знаю правильно составлен запрос или...

Как добавить еще один язык на сайт?
здравствуйте, помогите плз, вот у меня есть код с условием перехода с одного языка на сайте на второй, то есть сайт двухязычний, как...

Не пойму - как добавить еще один метод
Здравствуйте. Помогите пожалуйста с такой задачей: Есть готовая рабочая программа: unit polimor_; interface uses ...

Как добавить еще один подобный скрипт на сайте
У меня на сайте - стоит скрипт&lt;form action=&quot;add.php&quot; method=&quot;post&quot;&gt; &lt;table id=&quot;table_container&quot;&gt; &lt;tr&gt; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru