Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
1

Добавление кнопок в run-time

05.10.2012, 11:50. Показов 3347. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Имеется вот такой код:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        <Grid Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="1,1,1,1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Button Content="A) что-то" Style="{StaticResource ButtonStyle}"/>
            <Button Content="B) что-то" Grid.Column="1" Style="{StaticResource ButtonStyle}"/>
            <Button Content="C) что-то" Grid.Row="1" Style="{StaticResource ButtonStyle}"/>
            <Button Content="D) что-то" Grid.Column="1" Grid.Row="1" Style="{StaticResource ButtonStyle}"/>
        </Grid>
То есть грид 2х2, в каждой клетке по кнопке. Но так с ними неудобно общаться, вопрос: как можно их в рантайме создавать? На винформе делал, а тут не знаю... Просто по-имени неудобно обращаться, хотелось бы в массив запихнуть их (одномерный)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2012, 11:50
Ответы с готовыми решениями:

Создание меню в run time
мне надо создавать меню с глубоким уровнем вложенности. Как создавать верхний уровень я разобрался,...

Разница в координатах в run-time и design-time
Может кто-нибудь объяснить почему координаты любого объекта(например Tshape) отличаются во время...

Compile-time и run-time методы и функции
Добрый день. Есть две функции, которые делают идентичную работу: template&lt;bool leftShift,...

Разница в координатах в run-time и design-time
Может кто-нибудь объяснить почему координаты любого объекта(например Tshape) отличаются во время...

26
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
07.10.2012, 18:43 21
Author24 — интернет-сервис помощи студентам
Не работает у вас потому что вы Thread.Sleep в потоке пользовательского интерфейса делаете. Это же основной цикл приложения - пока обработчик события Click не завершиться, интерфейс не перерисуется и вообще никакие события обрабатываться не будут (приложение "зависнет"). Именно поэтому в потоке интерфейса Sleep (или любые длительные операции) вызывать не рекомендуется. Либо запускайте отдельный поток и в нем периодически меняйте Background, либо создайте таймер и в обработчике таймера опять же меняйте Background. Только учтите, что когда вы будете обращаться к контролам из другого потока, то это нужно делать через Dispatcher.Invoke или Dispatcher.BeginInvoke - иначе исключение возникнет.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2012, 18:48  [ТС] 22
canopen, насчет исключений доступа из чужого потока я знаю, поэтому на винформе и пользовался Thread.Sleep, потому что с инвоками не работал. Спасибо, сейчас попробую, если не получится, напишу сюда еще).

Кстати, возник вопрос, смысл в том, что мне нужно менять не два цвета, оранжевый-зеленый, а так "старый цвет"-"зеленый"-старый цвет". Вопрос: нельзя ли применить тут анимацию? Потому что насколько я помню, анимация сохраняет значение свойства, которое меняет, существовавшее на момент активации, и при отмене возвращает его в исходное состояние. Мне такое поведение как раз и нужно: был цвет кнопки оранжевый - станет зеленым, отменить - чтобы стал обратно оранжевым, был черный - сделать зеленый потом отменить - чтобы был опять черный.
0
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
07.10.2012, 19:18 23
Через анимацию конечно тоже можно. Примерно так будет:
C#
1
2
3
4
5
6
7
8
9
10
11
12
_buttons[i].Click += (sender, e) =>
{
    var button = (Button)sender;
    button.Background = new SolidColorBrush();
    var animation = new ColorAnimation(
        Colors.Black,
        Colors.Orange,
        new Duration(TimeSpan.FromMilliseconds(100)));
    animation.AutoReverse = true;
    animation.RepeatBehavior = new RepeatBehavior(5);
    button.Background.BeginAnimation(SolidColorBrush.ColorProperty, animation);
};
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2012, 19:53  [ТС] 24
canopen, изменил метод blink, не хочет:
C#
1
2
3
4
5
6
7
8
9
10
 private void Blink()
        {
            Background = new SolidColorBrush();
            var animation = new ColorAnimation(
                Colors.Black,
                Colors.Green,
                new Duration(TimeSpan.FromMilliseconds(TimeToSleep)))
                {AutoReverse = true, RepeatBehavior = new RepeatBehavior(N)};
            Background.BeginAnimation(SolidColorBrush.ColorProperty, animation);
        }
0
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
07.10.2012, 20:12 25
Ну, если вы изменили ТОЛЬКО метод Blink, то удивляться не стоит что ничего не работает - у вас же если не ошибаюсь этот метод в цикле вызывался. И кроме того после вызова Blink цвет в исходный сбрасывался. А теперь циклы и сбрасывание в исходный цвет не нужны - анимации сама будет повторяться столько раз, сколько задано при ее создании и сама в исходное состояние вернется.

К тому же у вас там такие маленькие интервалы стоят что их трудно заметить невооруженным взглядом. Поставьте хотя бы 100 мс.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
07.10.2012, 20:46  [ТС] 26
canopen, Спасибо еще раз) Проблема была в том, что сразу после Blink у меня стоял Reset(), он анимацию обрубал.) Интервал 100 как раз стоял, просто было долго из-за цикла, сейчас все нормально

Добавлено через 17 минут
Извиняюсь, последний вопрос: как после того, как анимация закончилась сделать так, чтобы в последний раз она не возвращалась в исходное положение (или закрасить клетку, когда закончится анимация). Я так понимаю, что анимация в своем потоке выполняется, поэтому следующей строчкой после вызова анимации нельзя просто Background = ... , вот что посоветуете?

Добавлено через 15 минут
Решил:
C#
1
animation.Completed += (sender, args) => Background = Brushes.Green;
0
430 / 431 / 93
Регистрация: 16.07.2012
Сообщений: 886
07.10.2012, 20:53 27
Когда создаете анимацию, то предварительно установите значение которое в итоге должно свойство иметь:
C#
1
Background = new SolidColorBrush(Colors.Green);
И измените свойство анимации FillBehavior:
C#
1
animation.FillBehavior = FillBehavior.Stop;
А лучше просто нецелое количество повторений задать (скажем 5.5)
1
07.10.2012, 20:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2012, 20:53
Помогаю со студенческими работами здесь

Run-time компоненты.
Здравствуйте. Возникла простая задача: имеется 2 потока, в первом идет выполнение процедуры показа...

Run-time error 9'
Помогите, пожалуйста, разобраться с ошибкой. Как сделать так, что бы в разных массивах (с разной...

Run-Time DLL
При запуске VB-приложения - сообщение об ошибке: Wrong version of run-time DLL Это приложение -...

Создание в run time
Как правильно создавать и удалять объекты в run time? А то создаю так:...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru