我有一个用于文本到语音转换的实用程序类,在其构造函数中可以选择必要的合成器语言,但问题是用户可能未安装该语言,然后,如果出现错误,选择列表中的第一种语言
//это конструктор
public SpeechSynth()
{
//выбираем голос по-умолчанию
try
{
SelectedVoice = _Synthesizer
.GetInstalledVoices()
.First(v => v.VoiceInfo.Description.Contains("France"));
}
catch (Exception)
{
//тогда выбираем первый доступный
SelectedVoice = _Synthesizer.GetInstalledVoices().First();
Debug.WriteLine("Ошибка выбора голоса при инициализации.");
//throw;
}
}
这是 ViewModel 的开始
private SpeechSynth _Speech;
//ctor
public MainViewModel()
{
try
{
_Speech = new SpeechSynth();
}
catch (Exception)
{
//здесь хотелось бы сообщить пользователю, что целевой язык не доступен
//требуется его установить.
}
}
因此,在块中的 VM 构造函数中,catch我仍然无法告诉用户任何信息(MessageBox例如调用)。这样的问题怎么解决?也许是一些延迟加载之类的?
PS 说明,原则上,当然,如果您在 VM 中 zafigachit MessageBox,那么它可以显示,但事实并非如此。为了调用 MessageBox,使用了一个实用消息类,顺便说一句,它也从构造函数中进行初始化,此外,从构造函数中用合成器完成了一些其他事情(我删除了所有这些以免干扰主要的事情与次要的)。如果出现错误,_Speech它会变成 == null,并且仍然无法使用它。
因为语言选择逻辑更高层次,我会把使用哪种语言的决定留给
MainVM. 是这样的:那么,VM中的逻辑:
基本上,如果您不想显示来自 VM 的消息框,则将标志
noFrenchInstalled转换为属性,如果已设置,则在 UI 中显示消息。