Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/20: Рейтинг темы: голосов - 20, средняя оценка - 4.65
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407

Вывод на печать изображения MVVM

09.02.2024, 15:47. Показов 5112. Ответов 69

Студворк — интернет-сервис помощи студентам
Есть у меня в модели такой вот простой метод:
C#
1
2
3
4
5
6
7
8
9
10
public void PrintingQR() 
{
    PrintDialog dlg = new PrintDialog();
    bool? result = dlg.ShowDialog();
 
    if (result.HasValue && result.Value)
    {
        dlg.PrintVisual(qrImage, "Печать картинки");
    }
}
Как я понял PrintDialog не может принимать ни Bitmap ни ImageBitmap, он принимает сами визуальные элементы, а мне нужно распечатать картинку, которая биндится к Image во View, отсюда вопрос, как мне в модель Image прокинуть? Сервис для этого писать чтоб из списка элементов окна его вытаскивать типа этого?
C#
1
2
3
4
5
6
7
8
9
10
11
12
public Visual PrintingQR()
{
    Visual result = null;
    foreach (Window window in Application.Current.Windows)
    {
        if (window.GetType() == typeof(MainWindow))
        {
            result =(window as MainWindow).image;
        }
    }
    return result;
}
Других вариантов пока не придумал, но чую есть способ попроще и красивее, ну или другой вариант печати

Добавлено через 23 минуты
Не PrintDialog, а PrintVisual я имел ввиду...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2024, 15:47
Ответы с готовыми решениями:

Вывод изображения на печать
Подскажите как вывести картинку на печать, именно картинку, про xml, pdf и doc файлы в поиске по находил, а как вывести картинку на печать...

Вывод на печать изображения
Здраствуйте!:)Как можно при печати дать пользовател выбрать принтер и получить контекст принтера для этого принтера?Заранее всем спасибо!:)

Вывод изображения в отчёт на печать
Всем доброго времени суток. Загружаю картинку в базу и вывожу на форму вот так (брал из примеров): &НаКлиенте Процедура...

69
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
12.02.2024, 23:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от xellan24rus Посмотреть сообщение
<Button Content="Print" Command="{x:Static Printing:PrintCommand.Print}" CommandTarget="{Binding ElementName=image}" />
XML
1
 <Button Content="Print" Height="30" VerticalAlignment="Bottom" Command="{x:Static local:PrintCommand.Print}" CommandTarget="{Binding ElementName=image}" />
На всякий случай.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
RoutedCommand отрабатываются через CommandBinding.
Мой пример тоже работает выше, я не читал о чем речь идет выше. Но сейчас прочитал, дополню ответ примером.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows;
 
namespace delete
{
    public static class PrintCommand
    {
        public static RoutedCommand Print = new RoutedCommand();
 
        static PrintCommand()
        {
            CommandManager.RegisterClassCommandBinding(typeof(UIElement), new CommandBinding(Print, ExecutePrintCommand));
        }
 
        private static void ExecutePrintCommand(object sender, ExecutedRoutedEventArgs e)
        {
            UIElement target = e.Source as UIElement;
            if (target != null)
            {
                PrintDialog printDialog = new PrintDialog();
                if (printDialog.ShowDialog() == true)
                {
                    var selectedMode = (e.Parameter as ComboBoxItem).Content;
                    if (selectedMode == "нормальный")
                    {
                        // Установите нормальные размеры для печатаемой картинки
                    }
                    if (selectedMode == "процесс")
                    {
                        // Установите размеры для режима процесса печати
                    }
 
                    printDialog.PrintVisual(target, "Печать элемента");
                }
            }
        }
    }
}
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Window x:Class="delete.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:delete"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Image x:Name="image" Height="100" VerticalAlignment="Top" Source="1.png"></Image>
        <ComboBox Name="Comboboxx" Margin="10,5,10,10" Text="Режим" Height="22">
            <ComboBox.Items>
                <ComboBoxItem Content="нормальный"/>
                <ComboBoxItem Content="процесс"/>
            </ComboBox.Items>
        </ComboBox>
               <Button Content="Print" Height="30" VerticalAlignment="Bottom" Command="{x:Static local:PrintCommand.Print}"  CommandParameter="{Binding SelectedItem, ElementName=Comboboxx}"></Button>
    </Grid>
</Window>
Можно в ComboBOx выбрать тип печати, работает на чистом View, Никакой Vm не использовал.

Добавлено через 23 секунды
firnen_dragon, дополнил ответ

Добавлено через 12 минут
Замените строчку с Button на эту
XML
1
<Button Content="Print" Height="30" VerticalAlignment="Bottom" Command="{x:Static local:PrintCommand.Print}" CommandTarget="{Binding ElementName=image}" CommandParameter="{Binding SelectedItem, ElementName=Comboboxx}"></Button>
Пример рабочий

Добавлено через 2 минуты
В эту строку
XML
1
 UIElement target = e.Source as UIElement;
Передается
XML
1
CommandTarget="{Binding ElementName=image}"
То есть ваше изображение
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
13.02.2024, 11:17  [ТС]
xellan24rus, Спасибо, очень подробно и понятно , e.Parameter тоже можно на null проверить, а то в комбобоксе может быть ничего и не выбрано
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static class PrintCommand
{
    public static RoutedCommand Print = new RoutedCommand();
 
    static PrintCommand()
    {
        CommandManager.RegisterClassCommandBinding(typeof(UIElement), new CommandBinding(Print, ExecutePrintCommand));
    }
 
    private static void ExecutePrintCommand(object sender, ExecutedRoutedEventArgs e)
    {
        try
        {
            UIElement target = e.Source as UIElement;
            if (target != null)
            {
                PrintDialog printDialog = new PrintDialog();
                if (printDialog.ShowDialog() == true)
                {
                    if (e.Parameter != null)
                    {
                        var selectedMode = (e.Parameter as ComboBoxItem).Content;
                        if (selectedMode == "нормальный")
                        {
                            // Установите нормальные размеры для печатаемой картинки
                        }
                        if (selectedMode == "процесс")
                        {
                            // Установите размеры для режима процесса печати
                        }
 
                        printDialog.PrintVisual(target, "Печать элемента");
                    }
                }
                else
                {
                    throw new ApplicationException("Режим не выбран");
                }
            }
            else
            {
                throw new ApplicationException("Изображение отсутствует");
            }
        }
        catch (Exception ex) 
        {
            MessageBox.Show(ex.Message);
        }
    }
}
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
13.02.2024, 11:39
Цитата Сообщение от firnen_dragon Посмотреть сообщение
Спасибо, очень подробно и понятно , e.Parameter тоже можно на null проверить, а то в комбобоксе может быть ничего и не выбрано
Пожалуйста) Не знаю как у вас, у меня vs подсвечивает все что угодно где может быть null) Дальше остается выбор, обработать это или же знаешь что там никогда null не будет и оставить как есть)
В target тоже может быть null если не выбрано изображение.
Цитата Сообщение от firnen_dragon Посмотреть сообщение
throw new ApplicationException("Режим не выбран");
Но вы делаете обработку выкидывая исключения, разве это не положит софт и пользователю не придется его перезапустить?
Вы делаете для пользователя сейчас, а не для программиста, который должен обрабатывать исключения.
Я бы на вашем месте уведомил пользователя об его ошибке и призвал к действию.
Что то вроде MessegeBox с текстом: "Выберите изображение перед печатью", "Выберите тип печати для запуска печати"
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
13.02.2024, 12:03  [ТС]
Цитата Сообщение от xellan24rus Посмотреть сообщение
Но вы делаете обработку выкидывая исключения, разве это не положит софт и пользователю не придется его перезапустить?
throw new Exception прокидывает исключение выше в MessageBox и приложение не падает при таком подходе
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
13.02.2024, 12:19
Цитата Сообщение от xellan24rus Посмотреть сообщение
Но вы делаете обработку выкидывая исключения, разве это не положит софт и пользователю не придется его перезапустить?
Это типовая практика и на фронте, и на бэке, когда исключения используются для контролируемого прекращения выполнения метода в случае ошибочной ситуации. Далее, исключение централизованно отлавливается каким-нибудь вышестоящим кодом (или прямо здесь же), который принимает решение, что делать дальше (преобразовать в HTTP-код ошибки, показать мессаджбокс, записать что-то в логи). В т.ч. позволяет делать сам код чище (если обработчик стоит где-то уровнем выше) и устранять дублирование кода.

P.S.: хотя сам код, чисто с точки зрения читаемости, я бы немного переформатировал для устранения излишней вложенности.
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
13.02.2024, 12:40  [ТС]
Цитата Сообщение от kotelok Посмотреть сообщение
я бы немного переформатировал для устранения излишней вложенности
А как бы вы упростили тут? Самому кажется, что громоздко выходит, но по другому не придумал
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
13.02.2024, 12:49
Цитата Сообщение от firnen_dragon Посмотреть сообщение
А как бы вы упростили тут?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
private static void ExecutePrintCommand(object sender, ExecutedRoutedEventArgs e)
{
    try
    {
        var target = e.Source as UIElement;
        if (target is null)
            throw new ApplicationException("Изображение отсутствует");
 
        //А тут точно нужно исключение (и мессаджбокс), а не просто тихий выход?
        //Человек ведь просто нажал 'Отмена' или как-то ещё закрыл окно.
        var printDialog = new PrintDialog();
        if (printDialog.ShowDialog() != true)
            throw new ApplicationException("Режим не выбран");
            //return;
 
        //Неудобная для пользователя логика:
        //  Сначала диалог, человек нажал, OK и ждёт печати, а метод просто молча завершается.
        //  Возможно, эту проверку надо в самое начало перенести? Ну и вывести какую-нибудь страшную 
        //  непредвиденную техническую ошибку (т.к. это всё же не ошибка пользователя).
        //Ну и тут скорее нужна проверка на 'is ComboBoxItem'.
        if (e.Parameter is null)
            return;
 
        //Тут может быть исключение 'NullReferenceException' (т.к. выше проверка просто на null).
        var selectedMode = (e.Parameter as ComboBoxItem).Content;
 
        //Вроде, это может дать ложный 'false' (т.е. строки будут равны, а результат 'false').
        //https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0252
        if (selectedMode == "нормальный")
        {
            //..
        }
        //Не принципиально, но тут более логично будет 'else if' использовать.
        if (selectedMode == "процесс")
        {
            //..
        }
 
        printDialog.PrintVisual(target, "Печать элемента");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
13.02.2024, 13:16  [ТС]
kotelok, Спасибо
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,175
13.02.2024, 14:27
Цитата Сообщение от kotelok Посмотреть сообщение
Это типовая практика и на фронте, и на бэке, когда исключения используются для контролируемого прекращения выполнения метода в случае ошибочной ситуации. Далее, исключение централизованно отлавливается каким-нибудь вышестоящим кодом (или прямо здесь же), который принимает решение, что делать дальше (преобразовать в HTTP-код ошибки, показать мессаджбокс, записать что-то в логи). В т.ч. позволяет делать сам код чище (если обработчик стоит где-то уровнем выше) и устранять дублирование кода.
Я понял про что вы, я обрабатываю несколько иным способом для пользователя. В случае не верно условия вызываю метод заготовленный для этого не верного условия и или что то делаю, тот же MessgeBox, далее return;
Тут не принципиально, каждому удобно по своему.

Добавлено через 40 секунд
Цитата Сообщение от firnen_dragon Посмотреть сообщение
throw new Exception прокидывает исключение выше в MessageBox и приложение не падает при таком подходе
Увидел, когда листал основной код не заметил, проявил не внимательность.
2
 Аватар для Andrey-MSK
3388 / 2274 / 388
Регистрация: 14.08.2018
Сообщений: 7,693
Записей в блоге: 4
19.02.2024, 10:36
xellan24rus, firnen_dragon, Если работаете с object, то перед его использованием проверяйте на совместимость с типом
C#
1
2
if (x is not DrawReport && y is not DrawReport)
    throw new ArgumentException("Этот тип объектов не поддерживается!");
А то получите трудноуловимые ошибки...

Добавлено через 1 минуту
И после этого уже делайте приведение
C#
1
2
DrawReport _x = x as DrawReport;
DrawReport _y = y as DrawReport;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2024, 10:36

Вывод на 3D-печать векторного изображения брелка.
всем привет! у меня есть векторное изображение и 3д притер,но нет опыта работы в сфере моделирования, мне нужно из этого сделать брелок,как...

[MVVM] Вставка изображения в RichTextBox
Здравствуйте уважаемые программисты. Я решив изучить WPF + MVVM, столкнулся с некоторыми трудностями. У меня есть RichTextBox и не...

Вывод на печать DBGrid из TabSheet на печать в файл ворда
Здравствуйте, не могли бы помочь с выводом на печать? В делфи 10 подключена база и информация выводится в DBGrid на TabSheet. Необходимо...

Печать изображения
Нужно сделать программу для печати музыкальных перфокарт для музкальной шкатулки фиксированного размера, но не представляю как перевести...

Печать изображения
При отправки изображения на печать сразу происходит печать, но нужно что бы сначала появлялось такое вот окно: как этого добиться? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
70
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru