2016-12-22 2 views
2

У меня есть приложение WPF, следующее за архитектурой MVVM.Сохраните область экрана в приложении WPF после MVVM

На одном из экранов находится диаграмма, которую необходимо сохранить в виде файла изображения при нажатии кнопки «Сохранить».

Я могу сохранить график, используя приведенный ниже код в код за:

 Rectangle rect = new Rectangle(0, 0, 100, 100); 
     Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
     Graphics g = Graphics.FromImage(bmp); 
     g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 
     bmp.Save(fileName, ImageFormat.Jpeg); 

Но мне нужно, чтобы быть в состоянии сделать это в моем ViewModel.

Для этого я прохожу ActualHeight & ActualWidth в качестве параметров команды для замковой команды кнопки в поле ниже образом:

<Button Content="Save" Command="{Binding MyViewModel.SaveCommand"> 
    <Button.CommandParameter> 
     <MultiBinding Converter="{StaticResource DimensionConverter}"> 
      <Binding Path="ActualWidth" ElementName="MyChart"/> 
      <Binding Path="ActualHeight" ElementName="MyChart"/> 
     </MultiBinding> 
    </Button.CommandParameter> 
</Button> 

В моем преобразователе:

public class DimensionConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, ...) 
    { 
     return values.Clone(); 
    } 

    ... 
} 

Тогда, в логика выполнения команды:

public void OnExecute(object parameter) 
{ 
    var values = (object[])parameter; 
    var width = (double)values[0]; 
    var height = (double)values[1]; 
    ... 
} 

Но, мне также нужно чтобы иметь возможность передавать координаты элемента управления Chart по началу. Это можно сделать с использованием метода PointToScreen. Но как я могу передать их модели просмотра, имея в виду MVVM?

Или есть ли способ, которым я могу захватить область экрана & Сохранить как изображение в архитектуре MVVM?

+0

В качестве возможного способа реализовать это использовать шаблон Messenger (например, Messager в среде MVVM Light) и отправить команду из View в ViewModel с битовой картиной для сохранения. Это все равно будет поддерживать ваше приложение в MVVM. – VitaliyK

+0

@VitaliyK: Не могли бы вы указать мне ссылку или ссылку, откуда я могу получить дополнительную информацию? – Ankit

+0

https://mallibone.com/post/mvvmlight-messenger - как пример – VitaliyK

ответ

1

Или есть ли способ, которым я могу захватить область экрана & Сохранить как изображение в архитектуре MVVM?

мнение может реализовать интерфейс, объявляющие свойства для всей информации, модель представления необходимо знать о:

public interface IView 
{ 
    double Width { get; } 
    double Height { get; } 
    double X { get; } 
    double Y { get; } 
} 

Вы могли бы затем передать сам вид в качестве параметра команды модели представления :

Command = new DelegateCommand<IView>(view => { /* do something */}); 

Это не нарушает шаблон MVVM, так как модель представления не имеет прямого ссылки на просмотр. Он знает только об интерфейсе, который реализует представление.

Интерфейс может даже объявлять методы. В некоторых сценариях только представление или элемент управления в представлении могут знать, как, например, сериализовать себя, а затем вам нужно делегировать эту функцию для представления, потому что модель представления не может быть предназначена для того, чтобы знать, как реально сериализовать элемент управления. Это деталь реализации самого управления.

Модель представления все еще должна инициировать процесс сериализации, хотя это означает, что она должна быть способна взаимодействовать с представлением так или иначе. Использование интерфейса - один из способов сделать это. Другой способ - использовать мессенджер или агрегатор событий. Пожалуйста, обратитесь к следующему сообщению в блоге, если вы хотите изучить концепцию: https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/.

+0

Здесь делегат Commomm означает, что он реализует интерфейс ICommand, не так ли? – Ankit

+0

Да, DelegateCommand - это реализация интерфейса ICommand в Prism: https://github.com/PrismLibrary/Prism/blob/master/Source/Prism/Commands/DelegateCommand.cs – mm8

+0

У меня есть еще одно разъяснение, как я могу просматривать представление как параметр к команде модели представления? – Ankit

Смежные вопросы