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