UWP XAML ToggleSwitch для установки голоса синтеза речи на мужской или женский

Я пытаюсь установить для voice.gender значение «мужской» или «женский» с помощью переключателя ToggleSwitch на странице настроек в приложении Template10 UWP.

Объявляю ТГ:

<ToggleSwitch x:Name="VoiceSelection" Header="Select Voice"
                                  IsOn="{Binding VoiceChoice, Mode=TwoWay}"
                                  OffContent="Male Voice" OnContent="Female Voice" />

Это должно быть хорошо.

Затем я установил логическое значение, которое позже будет использоваться для выбора мужчины или женщины.

public event PropertyChangedEventHandler PropertyChanged;
public static bool _voiceChoice = true;
public bool VoiceChoice
    {
        get
        {
            return _voiceChoice;
        }
        set
        {
            _voiceChoice = value;
            OnPropertyChanged("VoiceChoice");
        }
    }

protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }

Для информации, вот код, который позже назначит голос. Это тоже хорошо работает.

...
if (_voiceChoice == true)
                {
                    VoiceInformation voiceInfo =
                      (
                        from voice in SpeechSynthesizer.AllVoices
                        where voice.Gender == VoiceGender.Female
                        select voice
                      ).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;
                    synthesizer.Voice = voiceInfo;
                    stream = await synthesizer.SynthesizeTextToStreamAsync(text);
                }
                else
...

У меня проблема в том, что я могу выбрать голос, вручную установив логическое значение _voiceChoice, но я не могу установить его с помощью ToggleSwitch.

Я также понимаю, что это решение не очень чистое, и я открыт для любых предложений. Любая помощь приветствуется. Заранее спасибо.


person Franck E    schedule 17.07.2016    source источник
comment
Что вы подразумеваете под невозможностью установки через ToggleSwitch? Есть ли ошибка? Установщик свойства не вызывается?   -  person Martin Zikmund    schedule 17.07.2016
comment
Что-то в коде не так, хотел бы я знать, что .. :)   -  person Franck E    schedule 17.07.2016
comment
Если вы установите точку останова в установщике свойств и переключите переключатель, сработает ли точка останова?   -  person Martin Zikmund    schedule 17.07.2016
comment
Установлен ли ваш DataContext? Привязки не работают без контекста данных   -  person Anthony Russell    schedule 17.07.2016


Ответы (1)


На самом деле, я смотрел на это совершенно неправильно.
Вот что нужно, чтобы заставить ToggleSwitch переключаться между мужским и женским голосом в Template10. Могут быть более чистые решения, но это работает.

В SettingsPage.xaml добавьте:

<ToggleSwitch x:Name="VoiceSelection" Header="Select Voice"
    IsOn="{Binding UseVoiceSelection, Mode=TwoWay}"
    OffContent="Male Voice" OnContent="Female Voice" />

В SettingsService.cs добавьте:

public bool UseVoiceSelection
    {
        get { return _helper.Read<bool>(nameof(UseVoiceSelection), true); }
        set
        {
            _helper.Write(nameof(UseVoiceSelection), value);
        }
    }

В классе SettingsPartViewModel:ViewModelBase добавляем:

public bool UseVoiceSelection
    {
        get { return _settings.UseVoiceSelection; }
        set { _settings.UseVoiceSelection = value; base.RaisePropertyChanged(); }
    }

Наконец, в отдельном классе установите значение bool и выполните синтез речи:

public class ReadSpeech
{
    public static bool _voiceChoice = true;

    // Performs synthesis
    async Task<IRandomAccessStream> SynthesizeTextToSpeechAsync(string text)
    {
        IRandomAccessStream stream = null;
        using (SpeechSynthesizer synthesizer = new SpeechSynthesizer())
        {
            if (temp.SettingsPartViewModel.UseVoiceSelection == true)
            {
                VoiceInformation voiceInfo =
                  (
                    from voice in SpeechSynthesizer.AllVoices
                    where voice.Gender == VoiceGender.Female
                    select voice
                  ).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;
                synthesizer.Voice = voiceInfo;
                stream = await synthesizer.SynthesizeTextToStreamAsync(text);
            }
            else
            {
                VoiceInformation voiceInfo =
                  (
                    from voice in SpeechSynthesizer.AllVoices
                    where voice.Gender == VoiceGender.Male
                    select voice
                  ).FirstOrDefault() ?? SpeechSynthesizer.DefaultVoice;
                synthesizer.Voice = voiceInfo;
                stream = await synthesizer.SynthesizeTextToStreamAsync(text);
            }
        }
        return (stream);
    }
person Franck E    schedule 17.07.2016