Почему DialogResult является nullable bool в WPF?

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

один чувак там говорит:

Я получил решение, которое работает хорошо, чтобы распознавать речь и аудио запись. Здесь ( https://github.com/katchsvartanian/voiceRecognition ) ссылка на простой проект Android, который я создал, чтобы показать работу решения. Кроме того, я поместил несколько экранов печати в проект, чтобы проиллюстрировать приложение.

Я попытаюсь кратко объяснить подход, который я использовал. В этом проекте я объединил две функции: Google Speech API и запись Flac.

Google Speech API вызывается через HTTP-соединения. Майк Пульц (Mike Pultz) дает более подробную информацию об API:

"(...) новый API [Google] является API-интерфейсом для полнодуплексной потоковой передачи. Это означает, что он фактически использует два HTTP-соединения - одно POST запрос на загрузку контента в виде «живого» фрагментированного потока и второй GET-запрос для доступа к результатам, что имеет гораздо больше смысла для более длинных аудиосэмплов или для потокового аудио. »

Однако для этого API требуется получить звуковой файл FLAC для правильной работы. Это заставляет нас перейти ко второй части: Запись Flac

Я реализовал запись Flac в этом проекте путем извлечения и адаптации некоторых фрагментов кода и библиотек из приложения с открытым исходным кодом под названием AudioBoo. AudioBoo использует собственный код для записи и воспроизведения формата flac.

Таким образом, можно записать звук flac, отправить его в Google Speech API, получить текст и воспроизвести только что записанный звук.

Проект, который я создал, имеет базовые принципы для его работы и может быть улучшен для конкретных ситуаций. Чтобы заставить его работать в другом сценарии, необходимо получить ключ Google Speech API, который получается, будучи частью группы Google Chromium-dev. Я оставил один ключ в этом проекте, чтобы показать, что он работает, но в конце концов я его удалю. Если кому-то нужна дополнительная информация об этом, дайте мне знать, потому что я не могу разместить более двух ссылок в этом посте.

18
задан Dave Clemmer 2 August 2011 в 02:13
поделиться

5 ответов

На мой взгляд, это было сделано потому, что в большинстве случаев вам не нужны общие специализированные параметры, такие как «Повтор» или «Игнорировать».

Если вам нужно больше, чем OK / Отмена, вы должны использовать какой-то диалог задачи, например, с записанными ответами. Таким образом, вы не ограничены несколькими значениями перечисления, которые кто-то придумал несколько десятилетий назад, а DialogResult просто положительный / отрицательный для базового использования, и вы можете реализовать свое собственное свойство, специфичное для ваших расширенных потребностей. Следовательно, требуется только true / false, а значение null указывает на то, что окно еще не было закрыто (этому свойству еще не присвоено значение).

Если у вас есть диалог, который представляет собой нечто большее, чем просто вопрос, на который пользователь должен ответить (например, форма ввода), вам обычно лучше использовать OK / Отмена, поэтому вам не нужно больше значений.

6
ответ дан 30 November 2019 в 08:43
поделиться

Свойство DialogResult определено в классе Window . Не все Окна являются диалоговыми окнами. Следовательно, это свойство актуально не для всех окон. Окно , которое было показано с помощью Show () , а не ShowDialog () , будет (предположительно, если вы не установите его по какой-либо причине) будет иметь DialogResult = null .

Вот простой пример:

Window1.xaml :

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <StackPanel>
        <Button Name="b1">Show</Button>
        <Button Name="b2">ShowDialog</Button>
    </StackPanel>
</Window>

Window1.xaml.cs :

using System.Windows;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            b1.Click += new RoutedEventHandler(b1_Click);
            b2.Click += new RoutedEventHandler(b2_Click);
        }

        void b1_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.Closed += delegate
            {
                MessageBox.Show("" + w.DialogResult);
            };

            w.Show();
        }

        void b2_Click(object sender, RoutedEventArgs e)
        {
            var w = new Window();
            w.ShowDialog();
            MessageBox.Show("" + w.DialogResult);
        }
    }
}

Когда вы закроете окна, вы обратите внимание, что диалоговое окно имеет DialogResult из false , в то время как не диалоговое окно имеет null DialogResult .

.
15
ответ дан 30 November 2019 в 08:43
поделиться

Согласно документации MSDN :

DialogResult имеет значение null, когда диалоговое окно коробка отображается, но не принимается и не отменено.

Но я не уверен, как это могло произойти, если вы не имеете дело с несколькими потоками, обращающимися к диалогу.

В документации говорится, что неверно, когда происходит одно из следующих событий:

  • Нажмите ALT + F4.
  • Щелкает по кнопке «Закрыть».
  • В меню «Система» выбирает «Закрыть».
2
ответ дан 30 November 2019 в 08:43
поделиться

ИМО, это потому, что DialogResult не всегда используется. Видите ли, вы можете установить DialogResult только в том случае, если окно вызывается его методом ShowDialog (), если вы вызываете его с помощью его метода Show () и пытаетесь установить DialogResult в любое значение, оно выдаст InvalidOperationException. Так что я думаю, что это причина, по которой он допускает значение NULL, если вы вызываете окно с помощью метода Show (), оно будет равно NULL, если вы вызовете его с помощью ShowDialog (), решать вам.

0
ответ дан 30 November 2019 в 08:43
поделиться

ShowDialog всегда будет возвращать истину или ложь. DialogResult будет принимать нулевое состояние только тогда, когда диалог открыт. При переходе от null к true или false диалоговое окно закрывается, и исходный вызов ShowDialog возвращается.

0
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: