Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40

[WPF] Копирование элементов

18.12.2016, 13:16. Показов 7677. Ответов 35
Метки wpf (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Я уже дико устал лазить по книгам и интернету, возможно я просто чего-то не понимаю. Есть кнопка, которая в себе содержит Dockpanel. Мне надо при нажатии на другую кнопку, чтобы копировалась эта. Пробовал шаблон, но видимо, он не подходит. Какие есть идеи?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2016, 13:16
Ответы с готовыми решениями:

WPF копирование WriteableBitmap на другой WriteableBitmap
В silverlight, с использованием очень крутой библиотеки WriteableBitmapEx, можно вызвать метод Blit и отрисовать writeableBitmap в заданном...

Перемещение элементов WPF
Всем привет. Хотел разобраться с WPF, но на первом этапе возникла проблема: когда я перекидываю элемент(любой) на главную форму и хочу его...

Расположение элементов WPF
Добрый день. Долгое время делал приложения на Windows Forms. Хочу освоить WPF. К сожалению есть ряд вопросом. Как расположить текстовое...

35
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
19.12.2016, 14:37  [ТС]
Студворк — интернет-сервис помощи студентам
Нет, я именно так и сделал, как вы написали. А по сути, я создал новый объект, с нужными мне параметрами, и присвоил указателю существующего элемента, вновь созданный с нужными свойствами.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
19.12.2016, 14:47
Нет) Вот это:
Цитата Сообщение от novikov.ea Посмотреть сообщение
colorbutton b1 = (colorbutton)((Button) sender).DataContext;
b1.color = newcolor;
b1.label = newcolor.ToString();
совсем не тоже самое, что вот это
Цитата Сообщение от CyberKiller Посмотреть сообщение
SolidColorBrush newcolor = new SolidColorBrush(colorPiecker());
(sender as Button).DataContext = new colorbutton() { color = newcolor, label = newcolor.ToString() };
В первом случае будут изменяться свойства элемента, заданного через ItemsSource. А во втором случае элементы управления просто отвязываются от оригинального объекта и им в DataContext подсовывается левый объект. Этого левого объекта нет в ItemsSource. А именно ItemsSource вы затем должны будете сохранить, как "коллекцию цветов"
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
19.12.2016, 15:05  [ТС]
Я же говорю, что я именно так
C#
1
2
3
colorbutton b1 = (colorbutton)((Button) sender).DataContext;
b1.color = newcolor;
b1.label = newcolor.ToString();
и написал. При выполнении данного метода, с содержимым кнопки, вообще ничего не происходит.
Цитата Сообщение от novikov.ea Посмотреть сообщение
А во втором случае элементы управления просто отвязываются от оригинального объекта и им в DataContext подсовывается левый объект. Этого левого объекта нет в ItemsSource. А именно ItemsSource вы затем должны будете сохранить, как "коллекцию цветов"
Насколько я понял, в ItemSource вообще нету объектов, там лишь указатели на них. И я просто подменил 2 указателя, тем самым они подменились и в ObservableCollection-е.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
19.12.2016, 15:24
Цитата Сообщение от CyberKiller Посмотреть сообщение
При выполнении данного метода, с содержимым кнопки, вообще ничего не происходит
Снова мне приходится заниматься телепатией... Предполагаю, что у вас не реализовано уведомление свойств об изменениях. Вы хорошо изучали предоставленный мною пример? Обратили внимание, что классы наследуются от NotificationObject, который реализует INotifyPropertyChanged? Вот и ваш colorbutton должен реализовывать INotifyPropertyChanged.
Цитата Сообщение от CyberKiller Посмотреть сообщение
Насколько я понял, в ItemSource вообще нету объектов
И куда же тогда делись объекты из ItemsSource?) Если бы их там не было, то ничего на окошке и не отобразилось бы)
Цитата Сообщение от CyberKiller Посмотреть сообщение
там лишь указатели на них
Ссылки тогда уж)
Цитата Сообщение от CyberKiller Посмотреть сообщение
И я просто подменил 2 указателя, тем самым они подменились и в ObservableCollection-е
Они подменились? По-щучьему велению что-ли?)) Проверьте, ничего в ObservableCollection не изменилось)
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
19.12.2016, 18:10  [ТС]
Возможно я реализовал всё криво =(. Проверю сейчас, сохранив в файл и выгрузив обратно.

Добавлено через 2 часа 16 минут
Вы были абсолютно правы, придётся реализовывать класс NotificationObject. Но не совсем понимаю его структуру. Надобность его в том, чтобы следить изменяются ли свойства моего основного класса?
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
19.12.2016, 18:31
Цитата Сообщение от CyberKiller Посмотреть сообщение
Надобность его в том, чтобы следить изменяются ли свойства моего основного класса?
Точнее сказать, интерфейс INotifyPropertyChanged позволяет уведомлять об изменении свойств.
Цитата Сообщение от CyberKiller Посмотреть сообщение
не совсем понимаю его структуру.
Придётся разобраться) Можете просто использовать класс из моего примера. Существуют другие библиотеки, которые предоставляют свои реализации, более навороченные
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
19.12.2016, 23:13  [ТС]
Да, решил пока что, просто использовать ваш класс. Однако теперь мой шаблон вообще не принимает значений. Создаются пустые кнопки
Ваш класс полностью скопировал, вставил.
свой изменил так:
C#
1
2
3
4
5
6
7
8
9
public class colorbutton : NotificationObject
        {
            public String label;
           public String Label
           {
               get { return label; }
               set { SetProperty(ref label, value, () => Label); }
           }
        }
Теперь, даже при создании кнопки по шаблону, получается кнопка без шаблона(стандартная).
Что-то не так? Не могу понять.
Ага, триггеры тут подключаются, я так понял.

Добавлено через 4 часа 39 минут
Нет, дело там не в триггерах. В общем, почитал МакДональда. Там более просто реализовано чем у вас и понятнее. Смотрите, что получилось.
Было:
C#
1
2
3
4
public class colorbutton
{
public String label{ get; set;} 
}
Стало:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class colorbutton : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public void OnPropertyChanged(PropertyChangedEventArgs e)
            {
                if (PropertyChanged != null)
                    PropertyChanged (this, e);
            }
            public String label;
            public String Label
            {
                get { return label; }
                set
                {
                    label = value.ToString();
                    OnPropertyChanged(new PropertyChangedEventArgs("Content"));
                }
            }
Событие кнопки всё такое же:
C#
1
2
3
4
5
6
private void Color_Click(object sender, RoutedEventArgs e)
        {
            SolidColorBrush newcolor = new SolidColorBrush(colorPiecker());
            colorbutton b1 = (colorbutton)((Button)sender).DataContext;
            b1.label = newcolor.ToString();
        }
Однако теперь свойства будто не передаются в ItemSource;
Появляется просто пустая кнопка, и при создании и при изменении ничего не меняется.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
19.12.2016, 23:23
Ну, мне так сложно со слов что-то понять, скиньте архивчик, я посмотрю
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
19.12.2016, 23:25  [ТС]
Прошу не обращать внимания на структуру патерна, буду переписывать.
Надеюсь разберётесь.
Вложения
Тип файла: zip TestWPF.v.1.0.1.zip (122.1 Кб, 2 просмотров)
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
19.12.2016, 23:39
Ну, так всё понятно. Свойство - Label, поле - label. Привязку можно осуществить только на свойство, а у вас она прописана на поле.
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
19.12.2016, 23:42  [ТС]
Вот сейчас вообще ничего не понял
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
19.12.2016, 23:50
Лучший ответ Сообщение было отмечено CyberKiller как решение

Решение

Цитата Сообщение от novikov.ea Посмотреть сообщение
Привязку можно осуществить только на свойство, а у вас она прописана на поле
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        public class colorbutton : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            public void OnPropertyChanged(PropertyChangedEventArgs e)
            {
                if (PropertyChanged != null)
                    PropertyChanged (this, e);
            }
            public String label;  // <- Это поле
            public String Label  // <- Это свойство
            {
                get { return label; }
                set
                {
                    label = value;
                    OnPropertyChanged(new PropertyChangedEventArgs("label"));
                }
            }
        }
В DataTemplate Вы пишете {Binding label}
XML
1
2
3
4
5
6
7
8
<DataTemplate>
    <Button Click="Color_Click">
        <StackPanel Orientation="Horizontal">
            <Rectangle Fill="{Binding label}" Width="15" Height="15"></Rectangle>
            <Label Width="219" Content="{Binding label}"/>
        </StackPanel>
    </Button>
</DataTemplate>
А надо привязываться на свойство: {Binding Label}
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
19.12.2016, 23:57  [ТС]
Изменил, работает, спасибо большое. Но я не понимаю... Получается, когда мы наследуем класс от NotifyPropertyChanged, мы создаём некое поле (Label), которое обзываем свойством? Которое получает значение от нашего другого поля и даёт сигнал при изменении?
Стоп, всё-таки не работает, теперь привязка работает, но не работает изменение самой кнопки. =/
Исправил =). Поменял также в методе изменения, с label на Label.
0
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
20.12.2016, 00:15
Цитата Сообщение от CyberKiller Посмотреть сообщение
Получается, когда мы наследуем класс от NotifyPropertyChanged, мы создаём некое поле (Label), которое обзываем свойством?
Нет. Свойство - это член класса, который имеет методы доступа get и, если требуется, set. Вот статья про свойства.
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
20.12.2016, 00:47  [ТС]
Цитата Сообщение от novikov.ea Посмотреть сообщение
Свойство - это член класса, который имеет методы доступа get и, если требуется, set.
Ну, грубо говоря, то же самое поле. Не вижу отличия, лишь в его инициализации. Структурка необычная.
0
0 / 0 / 0
Регистрация: 18.12.2016
Сообщений: 40
21.12.2016, 20:46  [ТС]
Можно закрывать, ответ получен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.12.2016, 20:46

Использование элементов WinForms в WPF
Привет всем! Возможно ли использовать контролы, построенные на основе WinForms, использовать в WPF? То есть например разместить на...

Удаление элементов TreeView (WPF)
TreeViewItem selectedTVI = (TreeViewItem)TreeView1.SelectedItem; TreeView1.Items.Remove(selectedTVI); Данный вариант не...

Массив элементов управления в WPF
К своему удивлению, я обнаружил, что в WPF вообще не предусмотрен массив элементов управления. Однако, порывшись в глобальном, (но не...

Массив элементов управления WPF
Доброго времени суток.У меня вопрос следующего характера.Например у меня есть 4(или любое другое количество) элементов Rectangle.Называются...

Динамическое создание элементов
Здравствуйте. Пишу приложение wpf с паттерном mvvm. Нужно динамически создавать элементы по нажатию кнопки. Нашёл вот такой пример, но тут...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru