locked
ColorAnimation кнопки через стиль RRS feed

  • Общие обсуждения

  • Добрый вечер)

    Есть набор кнопок. При одной проверке, запускаю анимацию этих кнопок, затем делаю их IsEnabled = false;

    Только получается, что анимация перекрывается и кнопка сразу становится Disabled. Можно ли сделать так, чтобы не запускать анимацию через код, а сделать ее автоматической (через стиль кнопки) при изменении IsEnabled. Т.е. чтобы я задавал IsEnabled = false, происходила анимация, а только потом кнопка становилась недоступной.

    Вот код стиля кнопки:

    	<LinearGradientBrush x:Key="Pressed" EndPoint="0.5,1" StartPoint="0.5,0">
    			<GradientStop Color="LightGray" Offset="1"/>
            	<GradientStop Color="Gray"/>
    		</LinearGradientBrush>
    
    		<LinearGradientBrush x:Key="Disabled" EndPoint="0.5,1" StartPoint="0.5,0">
    			<GradientStop x:Name="stop1" Color="Gray" Offset="1"/>
            	<GradientStop x:Name="stop2" Color="Gray"/>
    		</LinearGradientBrush>
            <LinearGradientBrush x:Key="Norma" EndPoint="0.5,1" StartPoint="0.5,0">
                    <GradientStop Color="Gray" Offset="1"/>
                    <GradientStop Color="LightGray"/>
                </LinearGradientBrush>
            <local:LocalizedStrings xmlns:local="clr-namespace:EnglishSchool" x:Key="LocalizedStrings"/>
            <Style x:Key="ButtonStyle1" TargetType="Button">
            	<Setter Property="Background" Value="Transparent"/>
            	<Setter Property="BorderBrush" Value="{StaticResource PhoneForegroundBrush}"/>
            	<Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
            	<Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilySemiBold}"/>
            	<Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMedium}"/>
            	<Setter Property="Padding" Value="10,5,10,5"/>
    			<Setter Property="Margin" Value="1"/>
            	<Setter Property="Template">
            		<Setter.Value>
            			<ControlTemplate TargetType="Button">
            				<Grid Background="Transparent">
            					<VisualStateManager.VisualStateGroups>
            						<VisualStateGroup x:Name="CommonStates">
                                        <VisualState x:Name="Normal">
                                          
                                        </VisualState>
                                        <VisualState x:Name="MouseOver">
            								<Storyboard>
            									<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
            										<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource Pressed}"/>
            									</ObjectAnimationUsingKeyFrames>
            								</Storyboard>
            							</VisualState>
            							<VisualState x:Name="Pressed">
            								<Storyboard>
            									
            									<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
            										<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneButtonBasePressedForegroundBrush}"/>
            									</ObjectAnimationUsingKeyFrames>
            									<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground">
            										<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource Pressed}"/>
            									</ObjectAnimationUsingKeyFrames>
            								</Storyboard>
            							</VisualState>
            							<VisualState x:Name="Disabled">
            								<Storyboard>
            									<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
            										<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
            									</ObjectAnimationUsingKeyFrames>
    											
            									<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="ButtonBackground" >
            										<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource Disabled}"/>
            									</ObjectAnimationUsingKeyFrames>
            								</Storyboard>
            							</VisualState>
            						</VisualStateGroup>
            					</VisualStateManager.VisualStateGroups>
            					<Border x:Name="ButtonBackground" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5" Background="{TemplateBinding Background}">
            						
            						<ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"  VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" Margin="3"/>
            					</Border>
            				</Grid>
            			</ControlTemplate>
            		</Setter.Value>
            	</Setter>
    			
            </Style>

    И код анимации:

     Button btn = sender as Button;
                int num = common.num_but(sender as Button, mas_butt);
    
                LinearGradientBrush animbrush = new LinearGradientBrush();
                animbrush.StartPoint = new Point(0.5, 0);
                animbrush.EndPoint = new Point(0.5, 1);
                GradientStop stop1 = new GradientStop();
                stop1.Color = Colors.Gray;
                stop1.Offset = 1;
                GradientStop stop2 = new GradientStop();
                stop2.Color = Colors.LightGray;
                stop2.Offset = 0;
                animbrush.GradientStops.Add(stop1);
                animbrush.GradientStops.Add(stop2);
                
                btn.Background = animbrush;
                
                ColorAnimation gradid = new ColorAnimation();
                gradid.From = Colors.Gray;
                if (flag)
                    gradid.To = Colors.Green;
                else
                    gradid.To = Colors.Red;
                gradid.Duration = TimeSpan.FromSeconds(0.7);
                gradid.AutoReverse = true;
                Storyboard.SetTarget(gradid, stop1);
                Storyboard.SetTargetProperty(gradid, new PropertyPath(GradientStop.ColorProperty));
                
                ColorAnimation gradid2 = new ColorAnimation();
                gradid2.From = Colors.LightGray;
                if (flag) 
                    gradid2.To = Color.FromArgb(255,153,255,153);
                else
                    gradid2.To = Color.FromArgb(255, 255, 36, 0);
                gradid2.Duration = TimeSpan.FromSeconds(1.0);
                gradid2.AutoReverse = true;
                Storyboard.SetTarget(gradid2, stop2);
                Storyboard.SetTargetProperty(gradid2, new PropertyPath(GradientStop.ColorProperty));
                Storyboard my = new Storyboard();
                my.Children.Add(gradid);
                my.Children.Add(gradid2);
                my.Begin();

    17 февраля 2014 г. 20:10

Все ответы

  • <VisualState x:Name="Disabled">
    В этом блоке попробуйте написать Вашу анимацию без использования c#.
    18 февраля 2014 г. 5:50
  • Пробовал. Ничего не получилось. Не знаю, как правильно ее там реализовать


    • Изменено Strevg 18 февраля 2014 г. 11:25
    18 февраля 2014 г. 11:25
  • Никто не подскажет, как правильно это надо реализовать?
    18 февраля 2014 г. 17:28
  • Подскажут как свободное время будет. Ваша задача за 5 минут не решается.
    18 февраля 2014 г. 22:03
  • Спасибо)

    Думал, что кто-то сталкивался с этим

    19 февраля 2014 г. 8:15