Как синхронно воспроизводить медиа-элемент?

У меня есть шаблон данных, в котором есть текстовый блок и синтезатор речи. Когда я связываю его с данными, шаблон порождает как минимум 3 дочерних элемента. Синтезатор речи активируется нажатием одной галочки. В нормальных условиях работает нормально. Но если я энергично протестирую его и попытаюсь воспроизвести более одного синтезатора перед инициализацией, он воспроизведет неожиданный звук. И это продолжается даже после выхода с этой страницы.

Я делюсь кодом для события щелчка флажка. Пожалуйста, предложите решение.

    private async void checkboxPlay_Click(object sender, RoutedEventArgs e)
    {
        // when _mediaCounter == 0, synthesizer is stopped or not played
        // when _mediaCounter == 1, it is playing
        // when _mediaVounter == 2, it is paused
        Grid gd = (Grid)((sender as CheckBox).Parent as Grid).Parent;
        var child = VisualTreeHelper.GetParent(gd);
        try
        {
            if (sender is CheckBox)
            {
                if (_listElement.Count > 0)
                {
                    if (sender != _listElement[_checkCounter].CheckBox && _listElement[_checkCounter].CheckBox != null)
                    {
                        _listElement[_checkCounter].MediaElement.Stop();
                        _mediaCounter = 0;
                        _timer.Stop();
                        _listElement[_checkCounter].Slider.Value = 0;
                        _description = string.Empty;
                        _listElement[_checkCounter].CheckBox.IsChecked = false;
                    }
                }
                CheckBox cb = sender as CheckBox;
                Grid x = (Grid)VisualTreeHelper.GetParent(cb);

                _mediaIndex = Convert.ToInt32(
                        x.DataContext.ToString().Substring(x.DataContext.ToString().Length - 1, 1)
                        ) - 1;
                _checkCounter = _mediaIndex;


                if (_description != cb.DataContext.ToString())
                {
                    cb.IsChecked = true;
                    _description = cb.DataContext.ToString();
                    _mediaCounter = 0;
                    _InitializeCheckbox(cb);
                    _InitializeMedia();
                }
            }

            if (_mediaCounter == 0)
            {
                _mediaCounter = 1;
                string desc = string.Empty;
                SpeechSynthesizer synth = new SpeechSynthesizer();
                SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync(_description.ToString());
                _listElement[_checkCounter].MediaElement.SetSource(stream, stream.ContentType);
                _listElement[_checkCounter].MediaElement.Play();
            }
            else if (_mediaCounter == 1)
            {
                _listElement[_checkCounter].MediaElement.Pause();
                _timer.Stop();
                _mediaCounter = 2;
            }
            else
            {
                _listElement[_checkCounter].MediaElement.Play();
                _timer.Start();
                _mediaCounter = 1;
            }
        }
        catch
        {

        }
    }

person Vishal Jadhav    schedule 20.03.2014    source источник


Ответы (1)


Вы пытались использовать свойство MediaElement.CurrentState?

MediaElement.CurrentState

вот ссылка http://msdn.microsoft.com/En-US/Library/Windows/Apps/windows.ui.xaml.controls.mediaelement.currentstate

person Bryan Stump    schedule 22.07.2014