none
Анимировать (Button. Background) Бэкграунд Кнопки WPF . RRS feed

  • Вопрос


  • Добрый вечер столкнулся с проблемой,
    мне нужно анимировать бэкграунд кнопки,
    но не через XAML а динамически через функцию,
    т.е. функция создает кнопку ,

    помешает ее на canvas, и анимирует.

    все запускается, кнопка появляется, но анимация не работает.

    в инете все что я находил было через XAML и не динамически.
    пожалуйста помогите .
    Заранее благодарен.

    вот код функции.

     static public void StartScreen(Canvas canvas,Button startButton, string imagePath)
            {
                Image img = new Image();
                img.Source = new BitmapImage(new Uri(imagePath, UriKind.Relative));
                img.Width = 1024;
                img.Height = 768;
                Canvas.SetLeft(img, -4);
                Canvas.SetTop(img, 0);
    
               //startButton = new Button();
                startButton.Width = 120;
                startButton.Height = 30;
                startButton.Content = "";
    
                Canvas.SetLeft(startButton, (img.Width / 2) - startButton.Width / 2);
                Canvas.SetTop(startButton, (img.Height - (startButton.Height * 4) ));
    
                // animation of button
        Color rgbColorFrom = Color.FromRgb(0, 131,162); ;
        Color rgbColorTo = Color.FromRgb(0, 180, 220);
    
     ColorAnimation cl = new ColorAnimation(rgbColorFrom ,rgbColorTo , Duration.Forever);
             
              startButton.BeginAnimation(Button.BackgroundProperty, cl);
                // end animation
    
                canvas.Children.Add(img);
                canvas.Children.Add(startButton);
    
            }

    17 февраля 2013 г. 19:29

Ответы

  • Вы допустили ряд ошибок которые мне не видно было на С#.

    В первом случае анимация вообще не выполнялась, поэтому не было ошибки о попытке анимировать Bacground.

    Duration нужно ставить не в Forever, а конкретное значение в TimeSpan, например одна секунда. Непрерывное же повторение задается в RepeatBehavior. Так же, что бы не было резкого отскока из To к From нужно выставить AutoReverse в True.

    В общем вот рабочий код на VB (перевести на C# можно тут)

    Dim btn As New Button btn.Height = 100 btn.Width = 100 btn.Background = New SolidColorBrush(Color.FromRgb(0, 131, 162)) Canvas.SetLeft(btn, 50) Canvas.SetTop(btn, 50) Dim ca As New ColorAnimation ca.To = Color.FromRgb(255, 0, 0) ca.Duration = New Duration(New TimeSpan(0, 0, 1)) ca.RepeatBehavior = RepeatBehavior.Forever ca.AutoReverse = True

    CType(btn.Background, SolidColorBrush).BeginAnimation(SolidColorBrush.ColorProperty, ca)

    MyCanvas.Children.Add(btn)

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


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    19 февраля 2013 г. 6:05

Все ответы

  • А ошибки нет? По идее должна быть. ColorAnimation не может анимировать Background так как он имеет тип Brush, а не Color.

    Вам нужно привести Button.Background к типу кисти (у вас это SolidColorBrush) и уже у этой кисти анимировать ColorProperty.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    18 февраля 2013 г. 7:22
  • " Вам нужно привести Button.Background к типу кисти (у вас это SolidColorBrush) и уже у этой кисти анимировать ColorProperty. "

    Простите, но я не понимаю как это привести тип Button.Background к типу SolidColorBrush,

    и как анимация над SolidColorBrush будет влиять на анимацию Button.Background ?

      Я хотел сделать эффект пульсирущей( мигаюшей) кнопки,

    не только до момента как на нее нажали,  а всегда до/вовремя/ и после нажатия.

    Спасибо.

    18 февраля 2013 г. 15:25

  • Вот что я попробовал сделать, 
    бэкграунд кнопки задается цветом указанным 
    в переменной rgbColorFrom = Color.FromRgb//(0, 131, 162);
    но без анимации.
    
    
                Color rgbColorFrom = Color.FromRgb(0, 131, 162);
               
    
                Canvas.SetLeft(startButton, (img.Width / 2) - startButton.Width / 2);
                Canvas.SetTop(startButton, (img.Height - (startButton.Height * 4) ));
    
                // animation of button
    
                Color rgbColorTo = Color.FromRgb(0, 180, 220);
           
                SolidColorBrush btnbckgrndColor = new SolidColorBrush();
    
    
                startButton.Background = btnbckgrndColor;
    
    
                ColorAnimation cl = new ColorAnimation(rgbColorFrom, rgbColorTo, Duration.Forever);
    
                btnbckgrndColor.BeginAnimation(SolidColorBrush.ColorProperty, cl);
             
                // end animation
    
                canvas.Children.Add(img);
                canvas.Children.Add(startButton);

    18 февраля 2013 г. 16:14
  • Вот что я попробовал сделать, 
    бэкграунд кнопки задается цветом указанным 
    в переменной rgbColorFrom = Color.FromRgb//(0, 131, 162);
    но без анимации.

    Из вашего ответа не понятно решило ли это проблему (я не пишу на C#). Максимум что я вам могу подсказать, если проблема еще не решена это ссылку на описание приведения типов в C#

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    18 февраля 2013 г. 18:13
  • нет проблема к сожалению не решена,
    меняется бэкграунд кнопки , но нет не какой анимации(цвет не меняется).


    по поводу определения типов я посмотрел, вроде я все сделал правильно .

    18 февраля 2013 г. 19:14
  • Вы допустили ряд ошибок которые мне не видно было на С#.

    В первом случае анимация вообще не выполнялась, поэтому не было ошибки о попытке анимировать Bacground.

    Duration нужно ставить не в Forever, а конкретное значение в TimeSpan, например одна секунда. Непрерывное же повторение задается в RepeatBehavior. Так же, что бы не было резкого отскока из To к From нужно выставить AutoReverse в True.

    В общем вот рабочий код на VB (перевести на C# можно тут)

    Dim btn As New Button btn.Height = 100 btn.Width = 100 btn.Background = New SolidColorBrush(Color.FromRgb(0, 131, 162)) Canvas.SetLeft(btn, 50) Canvas.SetTop(btn, 50) Dim ca As New ColorAnimation ca.To = Color.FromRgb(255, 0, 0) ca.Duration = New Duration(New TimeSpan(0, 0, 1)) ca.RepeatBehavior = RepeatBehavior.Forever ca.AutoReverse = True

    CType(btn.Background, SolidColorBrush).BeginAnimation(SolidColorBrush.ColorProperty, ca)

    MyCanvas.Children.Add(btn)

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


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    19 февраля 2013 г. 6:05
  • Спасибо большое за ответ.

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

    Буду пробовать с Border.

    P.S.  Побольше бы таких людей как вы, в интернете.

    Спасибо .

    19 февраля 2013 г. 18:36