Раскадровки со связанными свойствами (пользовательский элемент управления: анимация изменения цвета) - PullRequest
1 голос
/ 01 октября 2011

Проще говоря, у меня есть это в ControlTemplate.Triggers состоянии EnterAction:

<ColorAnimation To="#fe7" Storyboard.TargetProperty="Background.Color" Duration="00:00:00.1" Storyboard.TargetName="brd"/>

Но я хочу, чтобы цвет 'to' (#fe7) был настраиваемым. Это элемент управления, полученный из ListBox. Я могу создать DependencyProperty, но, конечно, я не могу привязать к нему свойство To ColorAnimation, потому что Storyboard должен быть заморожен, и вы не можете заморозить что-либо с привязками (как я понимаю ).

Я попытался использовать {StaticResource} в To, а затем заполнить ресурс в коде при изменении DependencyProperty, например, установив this.Resources["ItemColour"] = newValue;. Очевидно, это не сработало, ведь это статический ресурс: новые значения свойств не были выбраны. DynamicResource дал ту же проблему, связанную с невозможностью замораживания.

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

Есть ли хороший способ сделать это? Должен ли я сам искать изменения свойств, динамически вызывать и управлять раскадровками в этот момент? Или наложение двух версий элемента управления, начального и конечного цветов и анимации непрозрачности? Оба кажутся смешными ..

Ответы [ 4 ]

2 голосов
/ 01 октября 2011

Kieren,

Будет ли это служить вашим целям?

Я расширил класс Grid с именем CustomGrid и создал TestProperty, значение которого при изменении изменит цвет фона Grid:

 public class CustomGrid : Grid
    {
        public bool Test
        {
            get
            {
                return (bool)GetValue(TestProperty);
            }
            set
            {
                SetValue(TestProperty, value);
            }
        }
        public static readonly DependencyProperty TestProperty =
            DependencyProperty.Register("Test", typeof(bool), typeof(CustomGrid),
                new PropertyMetadata(new PropertyChangedCallback
                    ((obj, propChanged) =>
                    {

                        CustomGrid control = obj as CustomGrid;
                        if (control != null)
                        {
                            Storyboard sb = new Storyboard() { Duration = new Duration(TimeSpan.FromMilliseconds(500)) };

                            Random rand = new Random();
                            Color col = new Color()
                            {
                                A = 100,
                                R = (byte)(rand.Next() % 255),
                                G = (byte)(rand.Next() % 255),
                                B = (byte)(rand.Next() % 255)
                            };


                            ColorAnimation colAnim = new ColorAnimation();

                            colAnim.To = col;
                            colAnim.Duration = new Duration(TimeSpan.FromMilliseconds(500));


                            sb.Children.Add(colAnim);
                            Storyboard.SetTarget(colAnim, control);
                            Storyboard.SetTargetProperty(colAnim, new PropertyPath("(Panel.Background).(SolidColorBrush.Color)"));

                            sb.Begin();

                        }
                    }
                )));
    }

Это событие нажатия кнопки, которое меняет цвет:

 private void btnClick_Click(object sender, RoutedEventArgs e)
        {
            gridCustom.Test = (gridCustom.Test == true) ? false : true;
        }

Я изменяю цвет фона сетки, потому что у меня нет вашего списка.

Наконецэто xaml:

 <Grid x:Name="grid" Background="White">
        <local:CustomGrid x:Name="gridCustom" Background="Pink" Height="100" Margin="104,109,112,102" >

        </local:CustomGrid>
        <Button Content="Click Me" x:Name="btnClick" Height="45" HorizontalAlignment="Left" Margin="104,12,0,0"  VerticalAlignment="Top" Width="145" Click="btnClick_Click" />
    </Grid>

Будет ли это служить вашей цели?Дайте мне знать или я неправильно понял вопрос?

РЕДАКТИРОВАТЬ:

См. Этот код:

Свойство ColorAnimation не может быть связано, как вы, вероятно, догадались.Но это не значит, что вы не можете изменить его значение.Вы всегда можете получить ссылку на ColorAnimation и изменить его на значение, и все будет хорошо работать.Так что из мира связывания WPF нам нужно немного изменить и связать данные, как мы это делали в Winforms :).В качестве примера посмотрите это:

Это xaml:

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" x:Class="ControlTemplateTriggers.MainWindow"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>

        <Storyboard x:Key="Storyboard">
            <ColorAnimation From="Black" To="Red" Duration="00:00:00.500" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="gridCustom" />
        </Storyboard>
    </Window.Resources>

    <Grid x:Name="grid" Background="White">
        <Grid x:Name="gridCustom" Background="Pink" Height="100" Margin="104,109,112,102" />

        <Button Content="Click Me" x:Name="btnClick" Height="45" HorizontalAlignment="Left" Margin="104,12,0,0"  VerticalAlignment="Top" Width="145" Click="btnClick_Click" />
    </Grid>
</Window>

Это код позади:

using System.Windows;
using System.Windows.Media.Animation;
using System.Windows.Media;
using System;

namespace Sample    {

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;

        }

        private void btnClick_Click(object sender, RoutedEventArgs e)
        {
            Storyboard sb = this.Resources["Storyboard"] as Storyboard;
            if (sb != null)
            {
                ColorAnimation frame = sb.Children[0] as ColorAnimation;
                Random rand = new Random();
                Color col = new Color()
                              {
                                  A = 100,
                                  R = (byte)(rand.Next() % 255),
                                  G = (byte)(rand.Next() % 255),
                                  B = (byte)(rand.Next() % 255)
                              };
                frame.To = col;
                sb.Begin();
            }
        }
    }


}

Как вы видите, я получаю ссылкуна раскадровку и изменение его в собственность.Ваш подход к StaticResource, очевидно, не сработает.Теперь вы можете в обратном вызове DependencyProperty получить ссылку на временную шкалу, которую вы хотите анимировать, и использовать VisualTreeHelper или что-то еще, а затем установить свойство To.

Это ваша лучшая ставка.

Дайте мне знать, если это решило вашу проблему:)

0 голосов
/ 25 ноября 2012

Оказывается, это просто невозможно.

0 голосов
/ 01 октября 2011

Конечно нет .. То, что я понял, это то, что вы хотите, чтобы цвет A в условии A и цвет B в каком-то другом условии B .... поэтому, если есть свойство с несколькими параметрами, вы можете поместить метки данных только для этого условия ...like if Job done = Red, Half done = Green как мудрый .. Если я неправильно понял проблему, пожалуйста, исправьте меня ..

Я думаю, что у меня возник вопрос ... Управление UR настраивается пользователем, так что любой пользовательвыберите, фоновый цвет элемента управления должен быть установлен в этот цвет с анимацией правильно?

0 голосов
/ 01 октября 2011

Вы можете поместить несколько DataTriggers, каждый из которых имеет соответствующий цвет для свойства "To" ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...