Есть проблема при работе с 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);
Наверное как-то так:
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);
}
}
Вы в своем коде пытаетесь показывать диалоги дважды. Каждый вызов 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;
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей