如何从ViewModel中的视图中访问和触发MediaElement中的事件?

本文关键字:MediaElement 事件 视图 ViewModel 访问 | 更新日期: 2023-09-27 18:18:48

我正在创建一个Windows 10应用程序,我正在实现语音功能。用户需要能够听完整的演讲,用声音回应,然后收到回应。但是,我在制作纯MVVM时遇到了麻烦。

对于MediaElement。结束了,我可以用一个行为,对吧?将结束的行为设置为我自己的命令,触发我想要的方法?

至于将源设置为合成文本并将AutoPlay设置为true,我可以将它们绑定到我的ViewModel中的属性。

,但MediaElement.Play()……如果我不能访问MediaElement,我如何从ViewModel中触发此方法?

我知道我可以做一些"hack"使其工作或使用代码背后,但我的目标是做这个"纯粹的MVVM",我的ViewModel不知道视图和任何视图元素。

感谢任何人的帮助。

如何从ViewModel中的视图中访问和触发MediaElement中的事件?

你可以这样做:

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;
}

这就是全部,尽管这只是实现相同目的的几种方法之一