0

我正在 WPF 应用程序中实现转换。

首先,我在 2 ImageBrush 中“保存”我的 2 FrameworkElement。然后我用它们设置我的着色器效果的 Input & Back (Brush) 属性。

    CustomEffect s = new CustomEffect();

    RenderTargetBitmap rtb = new RenderTargetBitmap((int)SourceFrameWorkElement.ActualWidth, (int)SourceFrameWorkElement.ActualHeight, 96, 96, PixelFormats.Pbgra32);

    rtb.Render(SourceFrameWorkElement);
    ImageBrush ib = new ImageBrush(rtb);
    s.Input = ib;

    rtb.Render(TargetFrameWorkElement);
    ib.ImageSource = rtb;
    s.Back = ib;

    SourceFrameWorkElement.Effect = s;

现在一切都设置好了,我想为我的着色器的 Time 属性设置动画,我试过这个:

    DoubleAnimation refDoubleAnimation = new DoubleAnimation(0.0, 1.0, Duration);
    Storyboard.SetTarget(refDoubleAnimation, SourceFrameWorkElement);
    Storyboard.SetTargetProperty(refDoubleAnimation, new PropertyPath("(Effect).(CustomEffect.Time)");
    refStoryboard.Children.Add(refDoubleAnimation);
    refStoryboard.Completed += new EventHandler(OnStoryboardCompleted);
    refStoryboard.Begin(SourceFrameWorkElement, true);

我在 begin 方法上得到一个 InvalidOperationException 并带有此消息:

“无法解析属性路径 '(Effect).(CustomEffect.Time)' 中的所有属性引用。
验证适用的对象是否支持这些属性。”

但是当我使用像 BlurEffect 这样的内置效果时,它可以工作......

有人能告诉我哪里错了吗?

编辑:
我也试过

    SourceElement.Effect.BeginAnimation(SlideInEffect.TimeProperty, refDoubleAnimation)

而不是使用情节提要,我没有得到异常,但是第二张图像立即弹出并且动画没有播放

4

1 回答 1

0

解决方案是使用 BeginAnimation ^^

事实上,我有第二张不透明度为 1 的图像,并且动画正在播放(我检查了进入我的 OnAnimationCompleted 事件处理程序的时间是否与转换持续时间相匹配)

所以我用 2 DiscreteDoubleKeyFrames 在 TargetElement 不透明度上创建了第二个动画来完成这个技巧,现在它可以工作了^^

如果我在 PropertyPath 中添加命名空间,也许故事板的东西可以工作,但我没有时间测试它,所以如果你愿意,可以尝试一下,并更新帖子 ^^。

于 2012-06-19T06:12:11.787 回答