Путь разработчика    

Сохранение управляющих изображений WPF в C#

Рекомендуем: Типы датчиков износа тормозных колодок и принцип их работы
eda2480d

Иногда мне нужно сохранять управляющие изображения WPF с прозрачным фоном по той или иной причине. На этот раз мне нужно было сделать несколько значков, которые отображали числа. Я мог бы использовать приложение Windows Forms (это было бы намного проще), но я хотел воспользоваться некоторыми функциями WPF. Кроме того, я знал, что в конечном итоге мне придется сохранять изображения WPF в другое время.

В этом примере вы можете ввести ширину и высоту, размер шрифта и текст и сделать изображение текста нужного размера. Когда вы нажимаете кнопку Capture, программа сохраняет результат в PNG-файле.

В следующем коде показана наиболее интересная часть кода XAML программы.

Python

После предварительных комментариев код определяет метки и текстовые поля, в которые вы вводите значения. Затем он определяет кнопку Capture. Это не очевидно из этого кода, если вы действительно не знаете свой XAML, но текстовые поля изменяются, когда окно становится шире или уже. Кнопка также придерживается правой части окна.

Более функциональная часть интерфейса начинается с Grid с именем grdText. Этот элемент управления содержит прямоугольник Rectangle с закругленными углами и заполнен с помощью кисти с линейным градиентом с эффектом растрового изображения с закругленным выпуском.

Сетка Grid также содержит TextBlock со скошенным растровым эффектом. Этот элемент управления содержит Run, который определяет отображаемый текст.

Оба Rectangle и TextBlock заполняют Grid, поэтому программе необходимо изменить размер Grid на также измените размеры других.

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

Python

Этот код проверяет, была ли еще создана сетка grdText. Если это так, программа анализирует введенную ширину и устанавливает ширину сетки этой суммы. ( Rectangle и TextBlock внутри Сетка автоматически изменяется в соответствии с.)

Следующий код показывает, как программа реагирует при изменении размера шрифта.

Python

Ключевым моментом здесь является то, что код устанавливает свойство FontSize объекта runText Run, определенного XAML. (Вот почему XAML дал объекту Run имя.)

До сих пор все довольно просто. К сожалению сохранение изображения Grid при нажатии кнопки Capture немного сложнее. (Это одна из моих проблем с WPF. Это такая операция, которая в течение многих лет использовалась в программировании Windows Forms. В ранних версиях .NET это было сложнее, но с течением времени были добавлены инструменты, чтобы упростить ее. WPF начал все сначала, игнорируя уроки, которые мы узнали за многие годы программирования .NET.)

В любом случае, код WPF, который захватывает изображение, довольно запутанный и включает в себя одну очень странную проблему, которая смущает многих людей. Эта проблема заключается в том, что простая попытка отобразить изображение элемента управления будет позиционировать изображение относительно происхождения родителя. Например, предположим, что элемент управления находится в позиции (100, 200) относительно происхождения своего родителя. Затем, если вы просто попытаетесь отобразить элемент управления, изображение будет сдвинуто на 100 пикселей вправо и на 200 пикселей вниз.

В любом случае, код WPF, который захватывает изображение, довольно запутанный и включает в себя одну очень странную проблему, которая смущает многих людей. Эта проблема заключается в том, что простая попытка отобразить изображение элемента управления будет позиционировать изображение относительно происхождения родителя. Например, предположим, что элемент управления находится в позиции (100, 200) относительно происхождения своего родителя. Затем, если вы просто попытаетесь отобразить элемент управления, изображение будет сдвинуто на 100 пикселей вправо и на 200 пикселей вниз.

...

Есть несколько способов, которыми вы можете обойти это. Один из них - переместить элемент управления в исходное состояние его родителя, отобразить его изображение и затем переместить элемент управления обратно.

Более простой подход (если вы можете применить слово «проще» ко всему, что связано с WPF и рендерингом) заключается в создании VisualBrush, который содержит изображение элемента управления. Затем вы можете заполнить целевое растровое изображение этой кистью, чтобы отобразить изображение элемента управления. Этот пример использует этот подход.

Вторая неприятная проблема заключается в том, что элемент управления отображается сам по себе, как он появляется на экране. Если он покрыт другим элементом управления, этот элемент управления отображается в рендеринге. Если элемент управления отрублен, поскольку он торчит за краем окна, его рендеринг также отрубается.

Следующий код выполняется при нажатии кнопки Capture.

Python

Этот код сначала устанавливает свойство SizeToContent окна для WidthAndHeight для обеспечения видимости всего элемента управления. Затем он вызывает следующий SaveControlImage метод для выполнения реальной работы.

Python

Этот метод сначала использует VisualTreeHelper.GetDescendantBounds, чтобы получить область, охваченную элементом управления и его потомками. Затем он создает DrawingVisual для представления ориентированного на пиксель графического объекта (в этом случае это будет растровое изображение).

Затем код создает DrawingContext, связанный с DrawingVisual. Он создает VisualBrush, который содержит изображение элемента управления. Затем он использует кисть, чтобы заполнить прямоугольник того же размера, что и элемент управления DrawingContext.

Далее код делает размер RenderTargetBitmap таким, чтобы он соответствовал фактическому размеру элемента управления. Вы можете использовать размер rect, но это, по-видимому, дает лучший результат. Затем код преобразует DrawingVisual в растровое изображение.

В этот момент метод имеет RenderTargetBitmap, удерживающий изображение элемента управления, и ему просто нужно сохранить растровое изображение в файл. Для этого код создает PngBitmapEncoder и добавляет растровое изображение в список Frames.

Наконец, метод записывает кодировщик в поток файлов для создания файла PNG.

Простой, не так ли?

Источник: http://csharphelper.com/blog/2015/10/save-wpf-control-images-in-c/



Отзывы (через Facebook):

Оставить отзыв с помощью аккаунта FaceBook:


Найдите прошедшее время в годах, месяцах, днях, часах, минутах и секундах в C#

Структура TimeSpan представляет собой прошедшее время. Он имеет Days, Hours, Minutes, Seconds и Milliseconds свойства, которые сообщают вы о времени, проше...

21 06 2021 0:26:28

Нарисуйте отмеченную круговую диаграмму в C#

Пример Нарисовать круговую диаграмму на C# показывает, как для рисования простой круговой диаграммы. Этот пример добавляет метки в срезы пирога. В этом при...

20 06 2021 6:13:31

Прочитайте значения реестра (чтобы получить размер значка на рабочем столе) в C#

Чтобы упростить использование методов реестра, в этом примере определяется класс RegistryTools, который содержит статические методы взаимодействия с реестр...

19 06 2021 3:20:26

Перезапустите диспетчер очереди печати в C#

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

18 06 2021 14:57:50

Слияние заставки и видео в каталоге в C#

( Обратите внимание, что этот пример был написан в Visual Studio 2010.) В этом примере показано, как вы можете объединять заставки и видео в каталоге. Приме...

17 06 2021 1:11:16

Преобразовать строку в число в Java? String to Int

Преобразование String в int или Integer - очень распространенная операция в Java. Существует несколько простых способов сделать это преобразование. Часто и...

16 06 2021 3:13:17

Как установить pip в Windows?

pip - система управления пакетами, используемая для установки и управления пакетами программного обеспечения, написанными на Python. Это замена easy_instal...

15 06 2021 8:44:39

Функции в Python

Функция является одной из основных концепций языка программирования. Функции - это «автономные» модули кода, которые выполняют отдельный сервис. Это матема...

14 06 2021 8:56:56

Получить HTML содержимое веб-страницы с помощью Python

Python предоставляет несколько способов сделать это в своей стандартной библиотеке . Вероятно, самый популярный способ загрузки файла - через HTTP с помощь...

13 06 2021 5:15:19

Разница между памятью Stack and Heap в Java

Модель Java Heap и Stack Memory определяет, как и когда разные потоки могут видеть значения, записанные в общие переменные другими потоками, и как синхрони...

12 06 2021 6:59:12

Сохранение управляющих изображений WPF в C#

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

11 06 2021 23:45:23

Язык программирования C# (Хейлсберг А. 2012)

Перед вами — четвертое издание главной книги по языку C#, написанной легендой программирования — Андерсом Хейлсбергом, архитектором C#, Delphi и Turbo Pasc...

10 06 2021 23:32:33

Delphi 6. Учебный курс (В. В. Фаронов)

В книге "Delphi 6. Учебный курс" даются начальные сведения по системе программирования Delphi, разработанной американской корпорацией Borland International...

09 06 2021 6:34:58

Нарисуйте заполненную картиной гистограмму в C#

Пример Сделать простая гистограмма в C# показывает, как рисовать гистограмму. В этом примере показано, как заполнять бары гистограммы изображениями. Следую...

08 06 2021 16:27:39

Треугольник Флойда и Треугольник Паскаля в C#

В этой статье мы напишем программу C# для печати треугольника Флойда и Треугольника Паскаля. Треугольник Флойда Вывод: Треугольник Паскаля Вывод:   Ис...

07 06 2021 22:53:51

Получите значение автонабора, которое только что было вставлено в C#

Если поле базы данных является полем автонабора, то база данных автоматически генерирует для него значения. Например, предположим, что таблицы Students име...

06 06 2021 13:46:16

Чтение и запись объектов в Java

Сериализация - это преобразование объекта в последовательность байтов, чтобы объект можно было легко сохранить в постоянном хранилище или потоковом потоке...

05 06 2021 8:10:18

Среда разработки Xcode

Xcode – IDE под Mac OS от Apple. Распространяется бесплатно через App Store. Благодаря свободному набору компиляторов данная среда разработки может работат...

04 06 2021 18:49:22

Полный справочник по C++ (Герберт Шилдт)

Четвертое издание энциклопедического труда Г. Шилдта " Полный справочник по C++", в котором всесторонне рассматривается и иллюстрируется основная терминолог...

03 06 2021 18:30:47

Где разместить JavaScript в HTML-файле?

Существует гибкость, предоставляемая для включения кода JavaScript в любом месте документа HTML. Код JavaScript может быть встроен в: Заголовок страницы ме...

02 06 2021 14:12:52

Многопоточное программирование в Python

Что такое Threading? Поток исполнения является наименьшим последовательность запрограммированных инструкций , которые могут управляться независимо друг от...

01 06 2021 17:44:32

Сравнение скорости арифметических операций в C#

В этом примере сравниваются скорости арифметических операций с разными типами данных. Существует большая разница между скоростями операций с использованием...

31 05 2021 8:27:18

Изучаем HTML, XHTML и CSS (Эрик Фримен, Элизабет Робсон)

Устали от чтения книг по HTML, которые понятны только специалистам в этой области? Тогда самое время взять в руки новое издание " Изучаем HTML, XHTML и CSS....

30 05 2021 17:36:45

1С: Бухгалтерия 8 с нуля. 100 уроков для начинающих (Гладкий А.)

Книга 1 С: Бухгалтерия 8 с нуля. 100 уроков для начинающих содержит полное описание приемов и методов работы с программой 1 С: Бухгалтерия 8. Рассматривается...

29 05 2021 17:29:21

События флеш-кликов в C#

Если кнопка запускает длинную задачу, вы, вероятно, не хотите, чтобы пользователь мог снова нажать кнопку (или, возможно, ничего в приложении), пока задача...

28 05 2021 9:55:38

Вопросы по Python - 2

Когда используется словарь вместо списка? Вы бы использовали словарь, если вам нужно сопоставлять (или ассоциировать) значимые ключи с значениями, тогда ка...

27 05 2021 18:33:14

Как предотвратить модификацию объекта в JavaScript?

Существует множество способов блокировки объекта в соответствии с вашими потребностями. Object.freeze() Object.seal() Object.preventExtensions() Object.fre...

26 05 2021 10:50:21

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

Перегрузка - это действие определения нескольких методов с тем же именем, но с разными параметрами. Переопределяющее средство переопределяет тело метода су...

25 05 2021 19:51:26

Многопоточный сервер сокетов в Python

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

24 05 2021 16:42:55

Сделать меню во время выполнения для приложения WPF в C#

В этом примере показано, как вы можете создавать меню во время выполнения и добавлять их в приложение WPF. Обычно вы создаете пользовательский интерфейс пр...

23 05 2021 19:16:40

Переменные в Bash

Переменные - одна из тех вещей, которые на самом деле довольно просты в использовании, но также довольно легко попасть в проблему, если вы неправильно понимаете, как они работают.  Таким образом, в этом разделе...

22 05 2021 11:40:13

Использование элементов управления Windows Forms, чтобы сделать расширитель в C#

WPF, Silverlight, Metro или все, что Microsoft называет этим материалом, теперь дни имеют несколько полезных элементов управления в пространстве имен Syste...

21 05 2021 13:50:17

Добавьте экран UAC для управления в C#

В Windows Vista и более поздних версиях Windows вы должны добавить экран UAC (контроль доступа пользователя) к кнопкам, запускающим процессы, требующие пов...

20 05 2021 6:51:41

Определение и использование бит-маски в C#

Пример Понимание бит-масок в C# объясняет, как использовать бит маски. Чтобы определить битовую маску, просто создайте enum и присвойте ему атрибут Flags,...

19 05 2021 14:11:10

Программирование на Java

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

18 05 2021 10:28:31

Температура по Цельсию и Фаренгейту в C#

В этой статье мы напишем программу переводящую температуру по Цельсию в температуру по Фаренгейту в C#. Вывод:  ...

17 05 2021 16:14:30

Как рассчитать разницу дат в Java

Есть много способов найти разницу между датами. Ниже приведен самый простой способ найти разницу между двумя датами. Вы можете просто взять число миллисеку...

16 05 2021 19:17:51

Как сделать стрельбу в Unity 2D с пулом объектов

В сегодняшнем уроке мы разберем как сделать стрельбу в Unity 2D с использованием пула объектов (Object pool) для реализации этого менее затратно....

15 05 2021 13:50:57

Использование именованные и необязательные параметры в C#

Дополнительные параметры - одно из немногих дополнений в последних версиях Visual Studio, которые действительно полезны. Обычно я пытаюсь опубликовать прим...

14 05 2021 15:11:26

В чем разница между Reader и InputStream в Java

InputStreams используются для чтения байтов из потока. Он захватывает байты данных байтом без какого-либо перевода. Поэтому они полезны для двоичных данных...

13 05 2021 11:43:26

Нарисуйте пунктирные линии с помощью разных стилей штриховки в C#

Контрольная панель определяет, как программа рисует концы точек и тире, которые составляют пунктирную линию. Если линия шириной 1 пиксель, вы, вероятно, не...

12 05 2021 17:39:24

Сделать созданный владельцем ListBox в C#

В этом примере показано, как вы можете сделать созданный владельцем ListBox. Обычно ListBox отображает текстовое представление своих объектов, но вы можете...

11 05 2021 12:40:35

Основы программирования в Embarcadero Delphi (Никита Культин)

Книга представляет собой практическое руководство по программированию в Embarcadero Delphi. В ней представлена технология визуального проектирования и собы...

10 05 2021 16:38:24

Связать массивы и списки в C#

Один из способов отображения элементов в массиве в ListBox состоит в том, чтобы перебирать элементы и добавлять их в ListBox по одному, но есть более прост...

09 05 2021 13:37:20

Слияние видео в C#

( Обратите внимание, что этот пример был написан в Visual Studio 2010.) Моя первоначальная проблема заключалась в том, что я создал кучу видео и вам нужно б...

08 05 2021 2:45:25

Java - нейтральная платформа

Как это работает? Во-первых, вы пишете исходный файл Java и скомпилируете его. Когда вы компилируете исходный код Java, результатом является файл .class, с...

07 05 2021 4:20:39

Сравните производительность команд if-else и switch в C#

Пример Сравните скорости условного оператора (тройной оператор? :) и оператор if-else в C# сравнивает производительность двух видов условных тестов. Джонни...

06 05 2021 13:27:53

Перемещение элементов управления формы в C#

В этом примере показано, как обрабатывать элементы управления различными типами в форме. Класс Control определяет свойство Controls, которое представляет с...

05 05 2021 23:45:46

Какая разница между потоками байтов и потоками символов

Поток - это способ последовательного доступа к файлу. В Streams вы можете обрабатывать данные по одному, поскольку массовые операции с ними недоступны. Но...

04 05 2021 10:40:23

Что такое ссылки на методы в Java?

Ссылки на методы являются признаком Java 8. Самое большое дополнение в Java8 - это лямбда-выражения. Ссылка на метод - это сокращенный синтаксис выражения...

03 05 2021 22:15:54

Еще:
Программирование -1 :: Программирование -2 :: Программирование -3 :: Программирование -4 :: Программирование -5 ::

И сказал Великий Программист:
«После трёх дней без программирования жизнь теряет смысл»