DialogResult с FolderBrowserDialog в WPF

Впервые я реализую FolderBrowserDialog в WPF, и мне это совсем не нравится...

Помимо проблем, с которыми я столкнулся, выяснив, что Windows.Forms не упоминается в моем проекте, теперь у меня возникают проблемы с попыткой увидеть, что такое возвращаемое значение DialogResult...

С OpenFileDialog в прошлом я делал это так:

OpenFileDialog ofd = new OpenFileDialog();
Nullable<bool> result = ofd.ShowDialog();

if (result == true)
{
    // all went well, carry on and do your thing here
}

К сожалению, теперь я получаю сообщения об ошибках, говорящих о преобразованиях типа DialogResult в bool и о том, что у вас есть.

Кажется, я не могу найти ничего о том, как выполнить этот шаг в использовании диалогового окна в WPF, может ли кто-нибудь пролить свет?

Заранее спасибо!

ИЗМЕНИТЬ

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

    private void btnBrowse_Click(object sender, RoutedEventArgs e)
    {
        if (cmbTemplate.SelectedItem == "Blockbusters")
        {
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            DialogResult result = fbd.ShowDialog();

            //
            // ERROR: 'System.Nullable<bool>' does not contain a definition for 'OK'
            // and no extention method 'OK' accepting a first argument of type
            // 'System.Nullable<bool>' could be found.
            //
            if (result == DialogResult.OK)
            {
                txtSource.Text = fbd.SelectedPath;
            }
        }
    }

person Ortund    schedule 11.02.2013    source источник
comment
Windows Forms Dialog не возвращает значение nullable bool, как это делают диалоги WPF, а DialogResult. Просто намек. :)   -  person Patryk Ćwiek    schedule 11.02.2013
comment
Если вы не можете понять ошибки, связанные с преобразованиями между различными типами, возможно, вам следует вернуться к основам ООП и С#, прежде чем пытаться что-то сделать в WPF, который представляет собой сложную структуру, не подходящую для неопытных разработчиков.   -  person Federico Berasategui    schedule 11.02.2013
comment
@HighCore, хотя ваше предложение могло быть наиболее уместным, оно также не имеет значения. Я понимаю ошибку, и поэтому я попытался установить результат в объект DialogResult, но это все еще не работает в операторе if - отсюда и мое замешательство   -  person Ortund    schedule 12.02.2013
comment
вы можете использовать var вместо Nullable‹bool›, var result = ofd.ShowDialog();   -  person fhnaseer    schedule 12.02.2013


Ответы (4)


Хорошо, так что все ответы, другие ответы здесь, были правильными.

Они просто упустили одну вещь, и я думаю, что это была моя вина...

Каждый раз, когда я видел DialogResult в Intellisense при попытке использовать его в моем выражении if (как мне сказали использовать, я видел это:

буль? Window.Dialog.Result
Получает или задает значение результата диалога, которое является значением, возвращаемым методом
System.Windows.Window.ShowDialog().

Исключения:
System.InvalidOperationException.

Этот конкретный объект DialogResult не тот, который я искал.

В итоге сработало следующее:

DialogResult result = fbd.ShowDialog();

if (result == System.Windows.Forms.DialogResult.OK)
{
    // do work here
}

Стоит отметить, что в моем использовании есть ссылка на System.Windows.Forms, поэтому я никогда не думал ссылаться на класс из System, как в приведенном выше фрагменте. Я думал, что он все равно использует это.

person Ortund    schedule 12.02.2013
comment
Кроме того, я настоятельно рекомендую не делать такие вещи, как cmbTemplate.SelectedItem == "Blockbusters" в WPF. UI не является данными, поэтому вы не должны рассматривать элементы пользовательского интерфейса как элементы данных и определять свои логика программы, основанная на состоянии этих элементов. - person Federico Berasategui; 12.02.2013
comment
Хорошо подмечено, и обычно я этого не делаю, но, поскольку я новичок в WPF, я не нашел лучшего способа сделать это (не то чтобы я очень старался). Хотя текст для каждого элемента в поле со списком не предназначен для изменения в любой момент во время выполнения, поэтому я не слишком беспокоюсь об этом. - person Ortund; 13.02.2013

DialogResult — это перечисление, определяющее значения для указания возвращаемые значения диалогов.

В вашем коде вы должны проверить DialogResult.OK для инициализации вашей переменной с путем, выбранным в диалоговом окне. DialogResult.OK возвращается при нажатии кнопки "ОК" в диалоговом окне, в противном случае возвращается DialogResult.Cancel.

if (result == DialogResult.OK){
  txtSource.Text = fbd.SelectedPath;
}
person Jehof    schedule 12.02.2013
comment
Как следует из вопроса: Typically I'd use DialogResult.OK except that doesn't appear as a valid value here. - person Ortund; 12.02.2013

Поздний ответ здесь, но почему бы и нет. .

private void SelectFolder()
{
    var dialog = new FolderBrowserDialog();
    var status = dialog.ShowDialog(); // ShowDialog() returns bool? (Nullable bool)
    if (status.Equals(true))
    {
        SelectedFolderPath = dialog.SelectedPath;
    }
}

Вы можете увидеть результат в сеансе отладки. Возвращает false при нажатии кнопки Cancel.

person flamyoad    schedule 14.07.2018

DialogResult.(ОК, отменить все, что вы хотите проверить),

if (result == DialogResult.OK) // DialogResult.(Your desired result, select from the list it generates)
{
    txtSource.Text = fbd.SelectedPath;
}
person fhnaseer    schedule 12.02.2013
comment
Как следует из вопроса: Typically I'd use DialogResult.OK except that doesn't appear as a valid value here. - person Ortund; 12.02.2013