Кнопка привязки Медиаэлемент - PullRequest
0 голосов
/ 18 марта 2019

У меня есть видео, к которому я хочу подключить кнопки Play / Paus / Stop.Мой код, на мой взгляд, выглядит следующим образом:

 <MediaElement Source="{Binding MediaUri}" LoadedBehavior="Manual" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}" RenderTransformOrigin="0.5,0.877" Margin="0,0,0,19" />
    <Button x:Name="Play" Height="20" Width="40" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}"/>

Моя кнопка должна воспроизводить видео при нажатии, но ничего не происходит.

В моей модели представления у меня есть этот код для кнопки воспроизведения, и когда я нажална кнопке я захожу сюда в режиме отладки, но ничего не происходит.

 public class MoviePlayerViewModel : TreeViewBase<MoviesViewModel>
{


public MoviePlayerViewModel(IDispatcherWrapper dispatcher, IViewManager viewManager, IKeyboardSimulator keyboardSimulator, IToggleInputManager toggleInputManager)
            : base(dispatcher, viewManager, keyboardSimulator, toggleInputManager)
        {
          UpdateGuards();

            ReadMediaFile();

            // Show course viewer at start
            IsIndexVisible = true;
        }

    public void Play(object sender, NavigationEventArgs e)
    {
        MediaElement mediaElement = new MediaElement();
        mediaElement.Source = MediaUri;
        mediaElement.LoadedBehavior = MediaState.Manual;
        mediaElement.Play();
    }

        private Uri _mediaUri;
    public Uri MediaUri
    {
        get
        {
            return _mediaUri;
        }
        set
        {
            _mediaUri = value;
            NotifyOfPropertyChange(() => MediaUri);
            NotifyOfPropertyChange(() => IsIndexVisible);
        }
    }

Когда я нажимаю кнопку сейчас, я получаю метод Play, но ничего не происходит.

Я использую C #WPF и Caliburn micro.

1 Ответ

1 голос
/ 18 марта 2019

Ваше определение MediaElement в XAML имеет привязку к MediaUri.Таким образом, он будет играть, как только назначен MediaUri.Чтобы обойти это, вам нужно LoadedBehavior к вашему XAML.

LoadedBehavior="Manual"

Полный код.

<MediaElement Source="{Binding MediaUri}" Visibility="{Binding IsIndexVisible, Converter={StaticResource InvertBoolToHiddenConverter}}" RenderTransformOrigin="0.5,0.877" Margin="0,0,0,19" LoadedBehavior="Manual" />

Для воспроизведения файла с помощью MediaElement с MVVM (и в вашем случае Caliburn Micro), потребует дополнительной работы.

В ViewModel

Вам необходимо объявить событие OnPlay и вызвать его в своем методе воспроизведения.

public event EventHandler OnPlay;

public void Play()
{
    if(OnPlay!=null)
       this.OnPlay(this, EventArgs.Empty);
}

В представлении,

Добавление загруженного события для вашего представления

Loaded="Window_Loaded" 

В коде за файлом,

private void Window_Loaded(object sender, RoutedEventArgs e)
{

 var viewModelInstance = DataContext;
 (viewModelInstance as MainWindowViewModel).OnPlay += (s, ev) => {    this.MediaPlayer.Play(); };
}

Где MediaPlayer - это x: Имя вашего MediaElement.

Поскольку MediaElement не позволяет нам воспроизводить файл из ViewModel, мы создаем обходной путь с помощью хака в View.Вы создаете событие в представлении, которое запускается по методу воспроизведения, назначенному для вашей кнопки.View, в свою очередь, воспроизводит медиафайл.

...