Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF淡入/淡出仅运行一次_C#_Wpf_Xaml - Fatal编程技术网

C# WPF淡入/淡出仅运行一次

C# WPF淡入/淡出仅运行一次,c#,wpf,xaml,C#,Wpf,Xaml,我有一个故事板和触发器的风格。动画效果很好,但只有一次 我有两个故事板FadeIn和FadeOut。在企业中,我启动FadeIn动画,在ExitActions中启动FadeOut动画。我用代码开始整个动画 TextBlock.StartFade = true; 当我调试上述代码时,每次命中StartFade都是False(这是正确的) 那么我做错了什么 以下是XAML中的样式。FadingTextBlock只是一个具有StartFade依赖属性的自定义TextBlock <Style T

我有一个故事板和触发器的风格。动画效果很好,但只有一次

我有两个故事板FadeIn和FadeOut。在企业中,我启动FadeIn动画,在ExitActions中启动FadeOut动画。我用代码开始整个动画

TextBlock.StartFade = true;
当我调试上述代码时,每次命中StartFade都是False(这是正确的)

那么我做错了什么

以下是XAML中的样式。FadingTextBlock只是一个具有StartFade依赖属性的自定义TextBlock

<Style TargetType="{x:Type Controls:FadingTextBlock}">
    <Setter Property="Visibility" Value="Collapsed" />
    <Setter Property="StartFade" Value="False" />
    <Setter Property="Opacity" Value="1.0" />

    <Style.Resources>
        <Storyboard x:Key="FadeIn">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Controls:FadingTextBlock.Opacity)" Storyboard.TargetName="{x:Null}">
                <EasingDoubleKeyFrame KeyTime="0:0:0.0" Value="0.0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1.5" Value="1.0" />
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Controls:FadingTextBlock.Visibility)" Storyboard.TargetName="{x:Null}">
                <DiscreteObjectKeyFrame KeyTime="0:0:0.0" Value="{x:Static Visibility.Visible}"/>
            </ObjectAnimationUsingKeyFrames>
            <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(Controls:FadingTextBlock.StartFade)" Storyboard.TargetName="{x:Null}">
                <DiscreteBooleanKeyFrame KeyTime="0:0:1.5" Value="False" />
            </BooleanAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="FadeOut">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(Controls:FadingTextBlock.Opacity)" Storyboard.TargetName="{x:Null}">
                <EasingDoubleKeyFrame KeyTime="0:0:0.0" Value="1.0" />
                <EasingDoubleKeyFrame KeyTime="0:0:1.5" Value="0.0" />
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Controls:FadingTextBlock.Visibility)" Storyboard.TargetName="{x:Null}">
                <DiscreteObjectKeyFrame KeyTime="0:0:1.5" Value="{x:Static Visibility.Collapsed}" />
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="StartFade" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard x:Name="In" Storyboard="{StaticResource FadeIn}" />                    
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard x:Name="Out" Storyboard="{StaticResource FadeOut}" />                    
            </Trigger.ExitActions>
        </Trigger>
    </Style.Triggers>
</Style>

您应该使用
操作停止已启动的情节提要在退出操作中播放

    <Trigger Property="StartFade" Value="True">
        <Trigger.EnterActions>
            <StopStoryBoard BeginStoryboardName="Out"/>
            <BeginStoryboard x:Name="In" Storyboard="{StaticResource FadeIn}" />                    
        </Trigger.EnterActions>
        <Trigger.ExitActions>
            <StopStoryBoard BeginStoryboardName="In"/>
            <BeginStoryboard x:Name="Out" Storyboard="{StaticResource FadeOut}" />                    
        </Trigger.ExitActions>
    </Trigger>

我最终在代码中使用了本地动画

在Xaml中将TextBlock不透明度设置为0

// Fading animation for the textblock to show that the settings are updated.
DoubleAnimation fadingAnimation = new DoubleAnimation();
fadingAnimation.From = 0;
fadingAnimation.To = 1;
fadingAnimation.Duration = new Duration(TimeSpan.FromSeconds(1.5));
fadingAnimation.AutoReverse = true;

UpdateMessage.BeginAnimation(TextBlock.OpacityProperty, fadingAnimation);
我基于@MystyxMac实现了自己的C#解决方案 将其提取为混合行为,这暴露了一个挑战

尝试在一行中显示同一通知两次将不起作用,因为不会调用dependency属性changed回调

我通过获取绑定、清除绑定并再次设置来克服这个问题

public class ShowFadingTextBehavior : System.Windows.Interactivity.Behavior<TextBlock>
{

    public static readonly DependencyProperty DurationProperty = DependencyProperty.Register(
      "Duration", typeof(TimeSpan), typeof(ShowFadingTextBehavior), new PropertyMetadata(TimeSpan.FromSeconds(5)));

    public TimeSpan Duration
    {
        get { return (TimeSpan)GetValue(DurationProperty); }
        set { SetValue(DurationProperty, value); }
    }

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
        "Text", typeof (string), typeof (ShowFadingTextBehavior), new PropertyMetadata("",OnTextChanged));

    private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

        var b = (ShowFadingTextBehavior) d;
        var text = (string) e.NewValue;

        if(string.IsNullOrEmpty(text))
            return;

        b.Show(text);
    }

    private void Show(string text)
    {
        var textBlock = AssociatedObject;

        if(textBlock==null)
            return;

        textBlock.Text = text;

        if(textBlock.Visibility==Visibility.Visible)
            return;

        textBlock.Visibility = Visibility.Visible;

        var a = new DoubleAnimation
        {
            From = 1.0,
            To = 0.0,
            FillBehavior = FillBehavior.Stop,
            BeginTime = TimeSpan.FromSeconds(1),
            Duration = new Duration(Duration)
        };

        var storyboard = new Storyboard();

        storyboard.Children.Add(a);
        Storyboard.SetTarget(a, textBlock);
        Storyboard.SetTargetProperty(a, new PropertyPath(UIElement.OpacityProperty));

        storyboard.Completed += delegate
        {
            textBlock.Visibility = Visibility.Collapsed;
            textBlock.Opacity = 1.0;

            var binding = BindingOperations.GetBinding(this, TextProperty);
            if(binding==null)
                return;

            ClearValue(TextProperty);
            BindingOperations.SetBinding(this, TextProperty, binding);
        };

        storyboard.Begin();

    }

    public string Text
    {
        get { return (string) GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}
公共类ShowFadingTextBehavior:System.Windows.Interactivity.Behavior
{
公共静态只读DependencyProperty DurationProperty=DependencyProperty.Register(
“持续时间”、typeof(TimeSpan)、typeof(ShowFadingTextBehavior)、新属性元数据(TimeSpan.FromSeconds(5));
公共时间跨度持续时间
{
获取{return(TimeSpan)GetValue(DurationProperty);}
set{SetValue(DurationProperty,value);}
}
公共静态只读DependencyProperty TextProperty=DependencyProperty.Register(
“Text”、typeof(string)、typeof(ShowFadingTextBehavior)、新PropertyMetadata(“,OnTextChanged));
私有静态void OnTextChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
var b=(ShowFadingTextBehavior)d;
var text=(字符串)e.NewValue;
if(string.IsNullOrEmpty(text))
返回;
b、 显示(文本);
}
私有无效显示(字符串文本)
{
var textBlock=关联对象;
if(textBlock==null)
返回;
Text=Text;
if(textBlock.Visibility==Visibility.Visibility)
返回;
textBlock.Visibility=可见性.Visibility;
var a=新动画
{
From=1.0,
To=0.0,
FillBehavior=FillBehavior.Stop,
开始时间=从秒开始的时间间隔(1),
持续时间=新的持续时间(持续时间)
};
var storyboard=新故事板();
故事板。儿童。添加(a);
故事板.SetTarget(一个文本块);
Storyboard.SetTargetProperty(一个新的PropertyPath(UIElement.OpacityProperty));
情节提要。已完成+=委托
{
textBlock.Visibility=Visibility.Collapsed;
textBlock.Opacity=1.0;
var binding=BindingOperations.GetBinding(这是TextProperty);
if(binding==null)
返回;
ClearValue(TextProperty);
BindingOperations.SetBinding(this,TextProperty,binding);
};
故事板。开始();
}
公共字符串文本
{
获取{return(string)GetValue(TextProperty);}
set{SetValue(TextProperty,value);}
}
}

我试过了,但是动画正在循环(in-out in-out in-out…)。更正。。。它只是渐渐消失了。淡出动画不工作。当不透明度达到1时,将再次开始淡入动画。一次又一次。再一次…@MystyxMac这可能是另一个问题,你的故事板正在循环。请尝试在动画上调整以下属性:
AutoReverse=“True”
RepeatBehavior=“Forever”
,谢谢您的回答,但我最终在代码中使用了本地动画。@MystyxMac如果这是您的问题解决方案,请将其作为答案发布并接受。(供其他用户将来搜索)。