如何从ViewModel中的视图中访问和触发MediaElement中的事件?
本文关键字:MediaElement 事件 视图 ViewModel 访问 | 更新日期: 2023-09-27 18:18:48
我正在创建一个Windows 10应用程序,我正在实现语音功能。用户需要能够听完整的演讲,用声音回应,然后收到回应。但是,我在制作纯MVVM时遇到了麻烦。
对于MediaElement。结束了,我可以用一个行为,对吧?将结束的行为设置为我自己的命令,触发我想要的方法?
至于将源设置为合成文本并将AutoPlay设置为true,我可以将它们绑定到我的ViewModel中的属性。
,但MediaElement.Play()……如果我不能访问MediaElement,我如何从ViewModel中触发此方法?
我知道我可以做一些"hack"使其工作或使用代码背后,但我的目标是做这个"纯粹的MVVM",我的ViewModel不知道视图和任何视图元素。
感谢任何人的帮助。
你可以这样做:
MVVM项目:
-ServiceLocator.cs
public class ServiceLocator
{
public static ServiceLocator Instance = new ServiceLocator();
private ServiceLocator()
{
}
private readonly IDictionary<Type, Type> TypeMap = new Dictionary<Type, Type>();
private readonly IDictionary<Type, object> TypeMapInstances = new Dictionary<Type, object>();
public void Register<TInterface, TClass>()
{
TypeMap.Add(typeof(TInterface), typeof(TClass));
}
public void Register<TClass>(object instance)
{
TypeMapInstances.Add(typeof(TClass), instance);
}
public T GetService<T>()
{
Type type = typeof(T);
object resolvedType = null;
try
{
if (TypeMapInstances.ContainsKey(type))
{
resolvedType = TypeMapInstances[type];
}
else
{
resolvedType = Activator.CreateInstance(TypeMap[type]);
TypeMapInstances.Add(type, resolvedType);
}
}
catch (Exception)
{
return default(T);
//throw new Exception(string.Format("Could not resolve type {0}", type.FullName));
}
return (T)resolvedType;
}
}
-IMediaElementService.cs
public interface IMediaElementService
{
void Play();
}
-YourVMClass.cs
public void Foo()
{
var mediaElementService = ServiceLocator.Instance.GetService<IMediaElementService>();
mediaElementService.Play();
}
客户端项目:
-MediaElementService.cs
public class MediaElementService : IMediaElementService
{
public void Play()
{
App.MediaElement.Play();
}
}
-App.cs
public static MediaElement MediaElement;
private void OnLaunched(LaunchActivatedEventArgs e)
{
ServiceLocator.Instance.Register<IMediaElementService, MediaElementService>();
}
-YourView.xaml
<MediaElement x:Name="_mediaElement" />
-YourView.xaml.cs
public YourView(){
InitializeComponent();
App.MediaElement = _mediaElement;
}
这就是全部,尽管这只是实现相同目的的几种方法之一