Есть проблема при работе с 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Недавно заинтересовался разработкой игр, очень понравился движок unity и решил изучать егоДля начала решил ознакомится с c# (по сайту mesharp
Выполнял тестовое задание при поиске работыРезультат моей работы никому не понравился, поэтому прошу помочь с разбором
Можно ли как-то удалить объект superA, чтобы все ссылки из массива стали автоматически указывать на null?
Собственно вопрос, для чего они нужны и когда может потребоваться генерить их ручками в коде?