以编程方式将MediaTimeline与Storyboard中的动画相结合

时间:2011-12-20 07:06:11

标签: wpf animation storyboard mediaelement

我正在尝试在Storyboard中使用MediaTimeline和DoubleAnimation来播放带动画的音频。一切都是在C#中实现的,没有XAML。在下面的代码中调用Storyboard.Begin后没有任何反应,也没有抛出任何异常。 mediaElement的HasAudio属性为false,从不调用MediaElement的MediaOpened事件。似乎mediaElement无法加载音频文件。我不知道MediaElement或MediaTimeline是否负责加载音频。没有MediaTimeline,DoubleAnimation工作正常。我在这里缺少什么?

private void SetStoryboard(double beginLeft, double endLeft, TimeSpan duration)
{
        mediaElement = new MediaElement();
        mediaElement.LoadedBehavior = MediaState.Manual;
        mediaElement.ScrubbingEnabled = true;
        mediaElement.MediaOpened += new RoutedEventHandler(MediaElement_MediaOpened);

        mediaTimeline = new MediaTimeline();
        mediaTimeline.Duration = new Duration(duration);
        mediaTimeline.Source = new Uri(musicFilePath);
        mediaTimeline.FillBehavior = FillBehavior.Stop;
        Storyboard.SetTarget(mediaTimeline, mediaElement);

        anim = new DoubleAnimation();
        anim.From = beginLeft;
        anim.To = endLeft;
        anim.Duration = new Duration(duration);
        anim.FillBehavior = FillBehavior.Stop;
        Storyboard.SetTarget(anim, slider);
        Storyboard.SetTargetProperty(anim, new PropertyPath(Canvas.LeftProperty));

        storyboard = new Storyboard();
        storyboard.SlipBehavior = SlipBehavior.Slip;
        storyboard.Children.Add(mediaTimeline);
        storyboard.Children.Add(anim);

        storyboard.Begin(this, true);
}

1 个答案:

答案 0 :(得分:0)

您的MediaElement不是VisualTree的一部分。您正在构建它,但由于它未分配给可视树,因此它将永远不会被布局系统使用。

您可以通过将其添加到有效的容器元素中来将其添加到代码隐藏中。 例如

<强> XAML:

<Grid x:Name="parentGrid">

<强>代码隐藏:

var mediaElement = new MediaElement();
parentGrid.Children.Add(mediaElement);

或者您可以将MediaElement放在页面/窗口上,删除构造MediaElement的行(.. = new MediaElement),然后通过代码隐藏访问它:

<强> XAML:

<MediaElement x:Name="mediaElement" Width="200" Height="100"/>