繁体   English   中英

WPF:使用 Storyboard 动画弹出不透明度

[英]WPF: Animating Popup opacity using Storyboard

我想动画一个水平滑入和淡入淡出结合弹出。 幻灯片是在HorizontalOffset ntalOffset 上使用DoubleAnimation实现的,并且工作正常,没有褪色 animation。 一旦我们通过PopupAnimation="Fade"添加“淡入淡出” animation 然后滑出停止工作。 我认为这是因为“IsOpen”现在为假并且弹出窗口已被删除(与PopupAnimation="Slide"没有滑出的方式非常相似)。

没问题,我想,我只会手动为不透明度设置动画,并在关闭时稍微延迟为“IsOpen”设置动画。

我知道我们不能直接为不透明度设置动画,因为需要影响子元素不透明度。

使用此元素:

                <local:AirspacePopup
                    x:Name="ControlsWindow"
                    ...
                    >
                    <Grid>
                        <Image Name="KeyMap" ... />
                    </Grid>
                    <local:AirspacePopup.Style>
                        <Style TargetType="local:AirspacePopup">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding ShowViewControls}" Value="True">
                                    ...Animations go here

我尝试了以下方法:

直接绑定到图像 - 有绑定错误

<DoubleAnimation
    Storyboard.Target="{Binding ElementName=KeyMap}"
    Storyboard.TargetProperty="Opacity"
    From="0" To="1" Duration="0:0:0.30" />

绑定到弹出子项(又名WPF 不使用 Name 的子项的动画属性)- 有绑定错误

<DoubleAnimation
    Storyboard.Target="{Binding ElementName=ControlsWindow, Path=Children[0]}}"
    Storyboard.TargetProperty="Opacity"
    From="0" To="1" Duration="0:0:0.30" />

并在代码隐藏中创建一个属性以将该属性转发给孩子。 没有错误,但 C# 中的断点从未被命中

<DoubleAnimation
    Storyboard.TargetProperty="ChildOpacity"
    From="0" To="1" Duration="0:0:0.30" />
        public double ChildOpacity
        {
            get => Child.Opacity;
            set {
                SetValue(ChildOpacityProperty, value);
                Child.Opacity = value;
            }
        }

我完全没有想法 - 我还没有尝试过什么?

注意:如果不清楚,我在 WPF 中非常新(或生锈)

我在这里偶然发现了一个答案: 我无法在 WPF 中为自定义属性设置动画

ViewModel 中的属性是动画的,只是不是通过访问器 (?)。 添加OnPropertyChanged处理程序允许我捕捉更改并做出适当的反应

        public double ChildOpacity
        {
            get => Child.Opacity;
            set => SetValue(ChildOpacityProperty, value);
        }

        protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            base.OnPropertyChanged(e);
            if (e.Property == ChildOpacityProperty)
            {
                Child.Opacity = (double)e.NewValue;
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM