WPF从ViewModel设置视频播放器

WPF从ViewModel设置视频播放器,wpf,media-player,viewmodel,Wpf,Media Player,Viewmodel,我正在处理WPF应用程序。我需要一个播放器来播放文件,但我需要ViewModel中的播放器,因为我需要它从ViewModel在播放器上创建快照。这是不工作,因为我可以听到的声音,但视频是空白的 我错过了什么 <ContentControl HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="{DynamicResource IconSnapShot}" /> //-------

我正在处理WPF应用程序。我需要一个播放器来播放文件,但我需要ViewModel中的播放器,因为我需要它从ViewModel在播放器上创建快照。这是不工作,因为我可以听到的声音,但视频是空白的

我错过了什么

<ContentControl HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Content="{DynamicResource IconSnapShot}" />
//-------------------------------------------------------------------------------------------------------------------- // //
// //--------------------------------------------------------------------------------------------------------------------

#region

using System;
using System.ComponentModel;
using System.Linq.Expressions;

#endregion

/// <summary>
///     The notify property changed.
/// </summary>
public abstract class NotifyPropertyChanged : INotifyPropertyChanged
{
    #region Public Events

    /// <summary>
    ///     The property changed.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region Methods

    /// <summary>
    ///     The raise property changed.
    /// </summary>
    /// <param name="propertyExpression">
    ///     The property expression.
    /// </param>
    /// <typeparam name="TProperty">
    /// </typeparam>
    protected void RaisePropertyChanged<TProperty>(Expression<Func<TProperty>> propertyExpression)
    {
        var memberExpression = (MemberExpression)propertyExpression.Body;
        var propertyName = memberExpression.Member.Name;
        RaisePropertyChanged(propertyName);
    }

    /// <summary>
    ///     The raise property changed.
    /// </summary>
    /// <param name="propertyName">
    ///     The property name.
    /// </param>
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}
#地区
使用制度;
使用系统组件模型;
使用System.Linq.Expressions;
#端区
/// 
///notify属性已更改。
/// 
公共抽象类NotifyPropertyChanged:INotifyPropertyChanged
{
#区域公共活动
/// 
///财产发生了变化。
/// 
公共事件属性更改事件处理程序属性更改;
#端区
#区域方法
/// 
///raise属性已更改。
/// 
/// 
///属性表达式。
/// 
/// 
/// 
受保护的void RaisePropertyChanged(表达式属性Expression)
{
var memberExpression=(memberExpression)propertyExpression.Body;
var propertyName=memberExpression.Member.Name;
RaisePropertyChanged(propertyName);
}
/// 
///raise属性已更改。
/// 
/// 
///属性名。
/// 
私有void RaisePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
#端区
}

要渲染视频,必须将
MediaElement
添加到视觉树中。在视图模型中创建
UIElement
是没有意义的。如果需要它,我可以从视频中捕获图像。不要在视图模型中使用任何视觉内容,只需绑定必要的数据,为其开发自定义控件。必须将
MediaElement
添加到视觉树中,视频才能渲染。在视图模型中创建
UIElement
是没有意义的。我需要它,以便从视频中捕获图像。不要在视图模型中使用任何视觉内容,只需绑定必要的数据,为其开发自定义控件
  using Gu.Wpf.Media;
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;

  public class PlayerModelView : NotifyPropertyChanged
  {
    private MediaElementWrapper playerFrameworkElement = new MediaElementWrapper();
    private Uri sourcePath;

    public PlayerModelView()
    {
        this.SourcePath = new Uri(@"J:\file.mkv", UriKind.Absolute);
    }
    public Uri SourcePath
    {
        get
        {
            return this.sourcePath;
        }

        set
        {
            this.sourcePath = value;
            this.PlayerFrameworkElement.Source = null;
            this.PlayerFrameworkElement.Source = value;
        }
    }
    public MediaElementWrapper PlayerFrameworkElement
    {
        get
        {
            return this.playerFrameworkElement;
        }

        set
        {
            this.playerFrameworkElement = value;
            this.RaisePropertyChanged(() => this.PlayerFrameworkElement);
        }
    }

 }
}
#region

using System;
using System.ComponentModel;
using System.Linq.Expressions;

#endregion

/// <summary>
///     The notify property changed.
/// </summary>
public abstract class NotifyPropertyChanged : INotifyPropertyChanged
{
    #region Public Events

    /// <summary>
    ///     The property changed.
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region Methods

    /// <summary>
    ///     The raise property changed.
    /// </summary>
    /// <param name="propertyExpression">
    ///     The property expression.
    /// </param>
    /// <typeparam name="TProperty">
    /// </typeparam>
    protected void RaisePropertyChanged<TProperty>(Expression<Func<TProperty>> propertyExpression)
    {
        var memberExpression = (MemberExpression)propertyExpression.Body;
        var propertyName = memberExpression.Member.Name;
        RaisePropertyChanged(propertyName);
    }

    /// <summary>
    ///     The raise property changed.
    /// </summary>
    /// <param name="propertyName">
    ///     The property name.
    /// </param>
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}