Флаг закрытия SaveFileDialog WPF MVVM ICommand

205
07 мая 2018, 21:49

Есть проблема при работе с SaveFileDialog. По задумке, при сохранении файла вывожу модальное окно с текстом "Успешно сохранено", в противном случае "Не сохранено". В итоге при сохранении выводятся оба модальных окна. Если нажать "Отмена" или "Х", происходит аналогичное. Создал отдельный класс для окна открытия/сохранения. Во ViewModel вызываю методы и совершаю действия. Интерфейс:

public interface IDialogService
{
    string FilePath { get; set; }
    void ShowMessage(string message);
    void ShowMessage(string message, string title, MessageBoxButton msButton, MessageBoxImage msImage);  
    bool OpenFileDialog();
    bool SaveFileDialog();  
}

Класс для открытия диалоговых окон:

public class DialogService : IDialogService
{

    public string FilePath { get; set; }

    public bool OpenFileDialog()
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        if (openFileDialog.ShowDialog() == true)
        {
            FilePath = openFileDialog.FileName;
            return true;
        }
        if (openFileDialog.ShowDialog() != true)
            return false;
        return false;
    }

    public bool SaveFileDialog()
    {
        SaveFileDialog saveFileDialog = new SaveFileDialog();
        if (saveFileDialog.ShowDialog() == true)
        {
            FilePath = saveFileDialog.FileName;
            return true;
        }
        if (saveFileDialog.ShowDialog() != true)
            return false;
        return false;
    }

    public void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }

    public void ShowMessage(string message, string title, MessageBoxButton msButton, MessageBoxImage msImage)
    {
        MessageBox.Show(message, title, msButton, msImage);
    }
}

ViewModel:

 private void ToggleGetImageExecute()
    {
        DialogService dialogService = new DialogService();
        if (dialogService.SaveFileDialog())
        {
            PhotoShootFrame = new Bitmap(PhotoShootFrame, photoWidth, photoHeight);
            PhotoShootGray.Convert<Gray, byte>().Resize(100, 100, Emgu.CV.CvEnum.INTER.CV_INTER_CUBIC);
            PhotoShootFrame.Save(dialogService.FilePath + fileExtencion, ImageFormat.Jpeg);
            //PhotoShootGray.Save("1");
            dialogService.ShowMessage(photoSaveDone, messageBoxTitle, MessageBoxButton.OK, MessageBoxImage.Information);
        }
        dialogService.ShowMessage(photoNonSave, messageBoxTitle, MessageBoxButton.OK, MessageBoxImage.Information);
    }

Ну и ToggleGetImageExecute отправляю в new RelayCommand(ToggleGetImageExecute);

Answer 1

Наверное как-то так:

public class DialogService : IDialogService
{

    public string FilePath { get; set; }

    public bool OpenFileDialog()
    {
        var openFileDialog = new OpenFileDialog();
        if (!openFileDialog.ShowDialog())
        {
            ShowMessage("Не сохранено");
            return false;
        }
        FilePath = openFileDialog.FileName;
        ShowMessage("Успешно сохранено");
        return true;      
    }

    public bool SaveFileDialog()
    {
        var saveFileDialog = new SaveFileDialog();
        if (!saveFileDialog.ShowDialog())
        {
            ShowMessage("Не сохранено");
            return false;
        }
        FilePath = saveFileDialog.FileName;
        ShowMessage("Успешно сохранено");
        return true;
    }

    public void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }

    public void ShowMessage(string message, string title, MessageBoxButton msButton, MessageBoxImage msImage)
    {
        MessageBox.Show(message, title, msButton, msImage);
    }
}
Answer 2

Вы в своем коде пытаетесь показывать диалоги дважды. Каждый вызов saveFileDialog.ShowDialog() или openFileDialog.ShowDialog() пытается показать диалог. Чтобы избежать двойного показа и проблем с ним, показывайте один раз и сохраняйте результат в переменную. То есть вместо этого

public bool SaveFileDialog()
{
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    if (saveFileDialog.ShowDialog() == true)
    {
        FilePath = saveFileDialog.FileName;
        return true;
    }
    if (saveFileDialog.ShowDialog() != true)
        return false;
    return false;
}

Попробуйте это

public bool SaveFileDialog()
{
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    var result = saveFileDialog.ShowDialog();
    if (result  == true)
    {
        FilePath = saveFileDialog.FileName;
        return true;
    }
    if (result != true)
        return false;
    return false;
}

И, кстати, последнее условие вообще можно удалить

public bool SaveFileDialog()
{
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    var result = saveFileDialog.ShowDialog();
    if (result  == true)
    {
        FilePath = saveFileDialog.FileName;
        return true;
    }       
    return false;
}
READ ALSO
Нужны советы по unity 3d [требует правки]

Нужны советы по unity 3d [требует правки]

Недавно заинтересовался разработкой игр, очень понравился движок unity и решил изучать егоДля начала решил ознакомится с c# (по сайту mesharp

174
Помогите с разбором тестового задания C#, wpf, nhibernate, ioc, mvvm

Помогите с разбором тестового задания C#, wpf, nhibernate, ioc, mvvm

Выполнял тестовое задание при поиске работыРезультат моей работы никому не понравился, поэтому прошу помочь с разбором

171
Возможно ли удалить объект, на который ссылаются одновременно несколько ссылок? - C#

Возможно ли удалить объект, на который ссылаются одновременно несколько ссылок? - C#

Можно ли как-то удалить объект superA, чтобы все ссылки из массива стали автоматически указывать на null?

133
Для чего нужны деревья выражений?

Для чего нужны деревья выражений?

Собственно вопрос, для чего они нужны и когда может потребоваться генерить их ручками в коде?

185