powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Триггерная анимация + обновление содержимого ItemsSource или других контейнеров
2 сообщений из 2, страница 1 из 1
Триггерная анимация + обновление содержимого ItemsSource или других контейнеров
    #38654306
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема следующая, есть некий контейнер элементов источником для которого служит ICollectionView,
элементам списка выступает UserControl у которого в зависимости от состояния зависимого свойства (DP) задана анимация. К примеру если свойство1 = true, то контрол плавно перетекает в голубой цвет, если false в красный.
Проблема следующая: когда я делаю Refresh для вьюхи коллекции, то объект контейнер пересоздаёт все Items. В результате обновления у каждого элемента списка свойства который отличается от значения по умолчанию свойства DP (UserControl'а) обновляется и срабатывает триггер. Проще говоря, после обновления вьюхи вся анимация срабатывает по новой.

На данный момент я нашел только 1 решение. Storyboard я запихал в ресурсы, а в контроле в коде в методе обновления свойства вызывается анимация если объект уже загружен IsLoaded == true, иначе вместо анимации цвет задается без анимации (сразу конечный цвет анимации)
Тогда после рефреша объекта просто задается тот цвет который у них уже был определен, а если мы меняем состояние то срабатывает анимация.
Есть более элегантный способ сделать тоже самое?
До:
Код: 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.
35.
36.
37.
38.
39.
40.
41.
<UserControl x:Class="CollectioViewSourceWithOutRefresh.TextBlockEx"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:my="clr-namespace:CollectioViewSourceWithOutRefresh"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             x:Name="Control">
    <UserControl.Template>
        <ControlTemplate>
            <TextBlock Text="{Binding Text, ElementName=Control}">
                <TextBlock.Background>
                    <SolidColorBrush x:Name="BackgroundBrush" Color="LightCoral"/>
                </TextBlock.Background>
            </TextBlock>
            <ControlTemplate.Triggers>
                <Trigger Property="my:TextBlockEx.Blue" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="BackgroundBrush" 
                                                Storyboard.TargetProperty="Color"
                                                To="LightBlue" Duration="0:0:2"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="BackgroundBrush" 
                                                Storyboard.TargetProperty="Color"
                                                To="LightCoral" Duration="0:0:2"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.ExitActions>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>


После:
Код: 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.
<UserControl x:Class="CollectioViewSourceWithOutRefresh.TextBlockEx"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             x:Name="Control">
    <UserControl.Resources>
        <Storyboard x:Key="AnimationToBlue">
            <ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color"
                            To="LightBlue" Duration="0:0:2"/>
        </Storyboard>
        <Storyboard x:Key="AnimationToRed">
            <ColorAnimation Storyboard.TargetName="BackgroundBrush" Storyboard.TargetProperty="Color"
                            To="LightCoral" Duration="0:0:2"/>
        </Storyboard>
    </UserControl.Resources>
    
    <TextBlock Text="{Binding Text, ElementName=Control}">
        <TextBlock.Background>
            <SolidColorBrush x:Name="BackgroundBrush" Color="LightCoral"/>
        </TextBlock.Background>
    </TextBlock>
</UserControl>


Код: 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.
public partial class TextBlockEx : UserControl
    {
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(TextBlockEx), new PropertyMetadata(string.Empty));
        public static readonly DependencyProperty BlueProperty =
            DependencyProperty.Register("Blue", typeof(bool), typeof(TextBlockEx), new PropertyMetadata(false, OnBlueChanged));
        
        public TextBlockEx() { InitializeComponent(); }
        
        public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } }
        public bool Blue { get { return (bool)GetValue(BlueProperty); } set { SetValue(BlueProperty, value); } }

        private static void OnBlueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var obj = (TextBlockEx)d;
            obj.ChangeVisualState("OnBlueChanged");
        }

        public void ChangeVisualState(string method)
        {
            if (IsLoaded)
            {
                var storyboard = (Storyboard)FindResource(Blue ? "AnimationToBlue" : "AnimationToRed");
                storyboard.Begin(this);
            }
            else
            {
                BackgroundBrush.Color = Blue ? Colors.LightBlue : Colors.LightCoral;
            }
        }
    }
...
Рейтинг: 0 / 0
Триггерная анимация + обновление содержимого ItemsSource или других контейнеров
    #38656917
Фотография @k@DElpher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть MultiTrigger .
У него свойство Conditions
MicrosoftВозвращает коллекцию Condition объекты. Изменения значений свойств применяются, если соблюдаются все условия в коллекции.
Может в него вторым условием добавить IsLoaded (только для него DP написать надо, потому что стандартное IsLoaded не DP)?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Триггерная анимация + обновление содержимого ItemsSource или других контейнеров
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]