Программная комбинация MediaTimeline с анимацией в раскадровке - PullRequest
1 голос
/ 20 декабря 2011

Я пытаюсь использовать MediaTimeline и DoubleAnimation внутри раскадровки для воспроизведения звука с анимацией.Все реализовано в C # без XAML.Ничего не происходит после Storyboard.Begin, вызываемого в приведенном ниже коде, и исключение не выдается.Свойство hasAudio объекта mediaElement имеет значение false, а событие MediaOleed MediaElement никогда не вызывается.Кажется, mediaElement не может загрузить аудиофайл.Я не знаю, отвечает ли MediaElement или MediaTimeline за загрузку аудио.DoubleAnimation прекрасно работает без MediaTimeline.Что мне здесь не хватает?

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 голосов
/ 20 декабря 2011

Ваш MediaElement не является частью VisualTree. Вы создаете его, но, поскольку он не назначен визуальному дереву, он никогда не будет использоваться системой макетов.

Вы можете добавить его в code-Behind, добавив его в допустимый элемент контейнера. например

XAML:

<Grid x:Name="parentGrid">

Код-за:

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

Или вы можете разместить MediaElement на своей странице / в окне, удалить строку, в которой вы создаете MediaElement (.. = новый MediaElement), и просто получить к нему доступ через код позади:

XAML:

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