绑定按钮中介元素

时间:2019-03-18 09:35:07

标签: wpf caliburn.micro mediaelement

我有一个要将“播放/暂停/停止”按钮连接到的视频。 我认为我的代码是这样的:

 <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 个答案:

答案 0 :(得分:1)

您在XAML中的MediaElement定义具有与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事件,然后在您的Play方法中调用它。

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是MediaElement的x:Name。

由于MediaElement不允许我们从ViewModel播放文件,因此我们在View中创建了一个解决方法。您在视图中创建一个事件,该事件在分配给您的Button的Play方法上触发。然后,View会播放媒体文件。