dir.by  
  Поиск  
Программирование, разработка, тестирование
WPF. Windows Presentation Foundation (отдельное приложение exe файл)
Пример "Рисуем картинку с движением и анимацией sprite на Canvas" C# WPF
  Посмотрели 10053 раз(а)       Комментариев 5  
 Последний комментарий: (2 декабря 2024 9:31) Я из-за вас два получил читать...       написать комментарий...
 Пример "Рисуем картинку с движением и анимацией sprite на Canvas" C# WPF 
последнее обновление: 23 июня 2024
Скачать: WpfApp1_moveSprite.zip ...
размер: 57 kb

Шаг 1. Создаем новый проект
Шаг 2. Добавим картинку в проект и помечаем как Resource
Сохраните эту картинку к себе на компьютер
Скачать ...
Шаг 3. Напишем код
  C#     Файл MainWindow.xaml.cs
using System.Drawing;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Resources;

namespace WpfApp1
{
     public class MyCanvas : Canvas
     {
          protected System.Drawing.Image _image1;
          protected System.Windows.Point _imagePos1;
          protected System.Windows.Size _imageSize1;
          protected int _imageGoXStep1;

          // sprit
          int SpriteIndex;
          Rectangle[] SpriteOffsets;

          public void LoadFromResource()
          {
               // load file
               StreamResourceInfo sri = Application.GetResourceStream(new Uri("dog_run.png", UriKind.Relative));
               if (sri != null)
               {
                    using (Stream s = sri.Stream)
                    {
                         _image1 = System.Drawing.Image.FromStream(s);
                    }
               }

               // set sprite rectangle
               SpriteIndex = 0;
               SpriteOffsets = new Rectangle[]{
                         new Rectangle(244, 3, 57, 42),
                         new Rectangle(304, 4, 54, 39),
                         new Rectangle(363, 4, 57, 38),
                         new Rectangle(420, 1, 55, 40),
                         new Rectangle(483, 4, 57, 36),
                         new Rectangle(542, 4, 57, 38),
               };

               // position
               _imagePos1 = new System.Windows.Point(10, 15);
               _imageSize1 = new System.Windows.Size(50, 50);
               _imageGoXStep1 = 4;
          }

          protected override void OnRender(DrawingContext drawingContext)
          {
               if (SpriteIndex < 0 || SpriteIndex >= SpriteOffsets.Length)
                    SpriteIndex = 0;

               Rectangle rect = SpriteOffsets[SpriteIndex];

               DrawPartImage(drawingContext, _imagePos1, _image1, rect);

               // next index
               SpriteIndex++;
          }

          public void DrawPartImage(DrawingContext drawingContext, System.Windows.Point pos, System.Drawing.Image imageFile, Rectangle part)
          {
               // Вырезаем выбранный кусок картинки
               Bitmap bmpPart = new Bitmap(part.Width, part.Height);
               using (Graphics g = Graphics.FromImage(bmpPart))
               {
                    g.DrawImage(imageFile, new Rectangle(0, 0, part.Width, part.Height), (float)part.X, (float)part.Y, (float)part.Width, (float)part.Height, GraphicsUnit.Pixel);
               }

               // convert to image source
               MemoryStream ms = new MemoryStream();
               ((System.Drawing.Bitmap)bmpPart).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
               BitmapImage bmpImage = new BitmapImage();
               bmpImage.BeginInit();
               ms.Seek(0, SeekOrigin.Begin);
               bmpImage.StreamSource = ms;
               bmpImage.EndInit();

               // draw image
               System.Windows.Size size = new System.Windows.Size(part.Width, part.Height);
               drawingContext.DrawImage(bmpImage, new System.Windows.Rect(pos, size));
          }

          public void MoveObjects()
          {
               _imagePos1.X += _imageGoXStep1;
          }

          public void ReDraw()
          {
               // InvalidateVisual() says Canvas to call OnRender
               InvalidateVisual();
          }
     }

     // MainWindow
     public partial class MainWindow : Window
     {
          protected MyCanvas _myCanvas;
          protected System.Windows.Threading.DispatcherTimer myTimer;
          protected int TimeStepInMilliseconds = 100; // 1/10 second

          public MainWindow()
          {
               InitializeComponent();

               // remove child elements
               Content = null;

               // add Canvas
               _myCanvas = new MyCanvas();
               AddChild(_myCanvas);

               // init my objects
               _myCanvas.LoadFromResource();

               // timer
               myTimer = new System.Windows.Threading.DispatcherTimer();
               myTimer.Tick += new EventHandler(OnMyTimerTick);
               myTimer.Interval = new TimeSpan(0, 0, 0, 0, TimeStepInMilliseconds); // in milli second
               myTimer.Start();
          }

          private void OnMyTimerTick(object sender, EventArgs e)
          {
               _myCanvas.ReDraw();
               _myCanvas.MoveObjects();
          }
     }
}
Шаг 4. Добавим NuGet пакет System.Drawing.Common
Запускаем приложение
Все работает
 
← Предыдущая тема
Пример "Рисуем картинку с движением на Canvas" C# WPF
 
Следующая тема →
Рисуем Line (сплошная и штриховая линии) | C# WPF приложение
 
Ваши Отзывы ... 1 комментариев
гость
2 марта 2020 10:20
Ошибки
admin (2 марта 2020 11:01) Какие ошибки? ответить
гость (25 октября 2023 10:40) крутые ответить
user2 (28 октября 2024 9:22) Это вообще не крутые ошибки ответить
Новичок (2 декабря 2024 9:31) Я из-за вас два получил ответить
   
Вашe имя
Ваш комментарий (www ссылки может добавлять только залогиненный пользователь)

  Объявления  
  Объявления  
 
WPF простое новое приложение
Создаем новое WPF приложение | C#
WPF layout
Делаем layout с DockPanel и StackPanel в WPF
События
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на TextBlock"| координаты экрана и относительные координаты | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Button"| координаты экрана и относительные координаты | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Grid и рисуем линию"| C# WPF приложение
Пример "При двойном нажатии левой клавишей мыши на Grid показываем сообщение"| C# WPF приложение
WPF элементы
Label
Пример "Устанавливаем текст в Label" через c# код | WPF приложение
иконки FontAwesome
Пример "Показываю иконки, для иконки подключаю библиотеку fontawesome5" | C# WPF приложение
Пример "Делаю анимацию для иконки, библиотека fontawesome5" | C# WPF приложение
 
TextBlock
Пример "Устанавливаем текст в TextBlock используя Binding". Еще добавим двойной Bindning используя INotifyPropertyChanged | C# WPF приложение
Пример "Несколько TextBlock (показываем тексты) и делаем так чтобы при mouse move выделялся элемент где мышка (mouse over)" | C# WPF приложение
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на TextBlock"| координаты экрана и относительные координаты | C# WPF приложение
Button
Пример "Получаем координаты мыши при нажатии левой клавишей мыши на Button"| координаты экрана и относительные координаты | C# WPF приложение
TextBox
Пример "Устанавливаем и получаем текст в TextBox используя Binding" | C# WPF приложение
Пример "Устанавливаем текст в TextBox" через c# код | WPF приложение
 
TextBox с Place Holder
Пример "Показываем Place Holder в TextBox" | WPF приложение
Пример "Показываем Place Holder с иконкой в TextBox", для иконки подключаю библиотеку fontawesome5 | WPF приложение
 
TextBox с проверкой текста (валидация)
Пример "Устанавливаем текст в TextBox используя Binding и делаем валидацию (если текст не правильный)" | C# WPF приложение
 
ComboBox
Пример "В ComboBox делаем редактирование текста. Получаем текст используя Binding" | C# WPF приложение
 
ItemsControl
Пример "ItemsControl, кнопка и обработчик нажатия" | WPF приложение
Grid
Что такое Grid в WPF
Как добавить RowDefinition, ColumnDefinition в Grid (мышкой в XAML design editor) | C# WPF приложение
В Grid добавляем vertical scrolling | WPF приложение
DataGrid
Пример "DataGrid делаем bind данных", кнопка и обработчик нажатия в DataGrid, выравнивание текста в DataGrid, scrolling | WPF приложение
Как сделать scrolling для DataGrid ? | C# WPF приложение
Scrolling для DataGrid (чтобы скролинг работал когда мы крутим колесо мышки и мышка находится вне scroll bar) | C# WPF приложение
Как выделить row цветом при нажатии на row мышкой (change background for selected row) в DataGrid ? | C# WPF приложение
Как row DataGrid выделить цветом (сделать background) ? | C# WPF приложение
Пример "DataGrid делаем сортировку колонки по своему алгоритму (Custom Sort)" | WPF приложение
DataGrid внутри DataGrid
Пример портфолио сотрудников с описанием задач: "DataGrid внутри DataGrid используя RowDetailsTemplate" | WPF приложение
 
ListView
Пример "В ListView расширяем колонку при добавлении данных (auto column width)" | WPF приложение
Пример "В ListView используем ItemTemplate DataTemplate" | WPF приложение
 
ScrollViewer
В Grid добавляем vertical scrolling | WPF приложение
Как сделать scrolling для DataGrid ? | C# WPF приложение
Scrolling для DataGrid (чтобы скролинг работал когда мы крутим колесо мышки и мышка находится вне scroll bar) | C# WPF приложение
Пример "Делаем ScrollBar меньше(больше) в ScrollViewer" | C# WPF приложение
Resource файл
Добавляем картинку (jpg, bmp, png) в проект и помечаем как Resource | C# WPF приложение
Image
В элементе Image показываем картинку (jpg, bmp, png) из Resource | C# WPF приложение
Выбираем картинку (jpg, bmp, png) из компьютера и показываем в элементе Image. Сохраняем картинку в базу данных | C# WPF приложение
Пример "В Image элементе делаем Binding для Source" | C# WPF приложение
Пример "Конвертируем текст base64 в картинку Bitmap и показываем в Image элементе" | C# WPF приложение
Пример "Открываем SVG файл и показываем картинку в Image элементе" | C# WPF приложение
 
Canvas
Пример "Создаем Canvas и рисуем картинку" C# WPF
Пример "Рисуем картинку с движением на Canvas" C# WPF
Пример "Рисуем картинку с движением и анимацией sprite на Canvas" C# WPF
 
Line
Рисуем Line (сплошная и штриховая линии) | C# WPF приложение
Пример "Создаем и рисуем линию при нажатии левой клавишей мыши на Grid"| Grid Line | C# WPF приложение
Конвертируем картинку в XAML Path Geometry
Конвертируем SVG в XAML(используя Adobe Illustrator), заполняем Path Data Geometry, показываем линии на экране | C# WPF приложение
Конвертируем SVG в XAML(используя Dias SVG to UWP XAML Converter), заполняем Path Data Geometry, показываем линии на экране | C# WPF приложение
Конвертируем PNG в SVG в XAML | C# WPF приложение
Converter SVG to XAML | WPF C#
Конвертируем XAML в SVG | C# WPF приложение
ViewBox
Пример "ViewBox делаем Binding для Left, Top, Width, Height, ContetnPresenter binding" | C# WPF приложение
Width by percentage
Разделить экран по вертикали (по ширине) на 2 равные части экран (width1 = 50%, width2 = 50%), используем Grid | C# WPF приложение
Разделить экран по вертикали (по ширине) на 2 части (width1 = 70%, width2 = 30%), используем Grid | C# WPF приложение
Пример "Устанавливаем ширину элемента в процентах от ширины родительского элемента" (width in percentage), пишем свой IValueConverter | C# WPF приложение
База данных (Entity Framework)
Entity Framework в приложении WPF. Используем Code First (пишем c# код, а таблицы в базе данных создаются сами)
Создаем свои WPF элементы
Пример "Создаем свой WPF элемент используя Style и новый xaml файл. Новый элемент это: вверху Title, внизу текст в рамке. Используем Binding | C# WPF приложение
Пример "Создаем свой новый WPF элемент со своими свойсвами в новом cs и xaml файлах. В WPF новом элементе: вверху Title, снизу текст и в рамке | C# WPF приложение
WPF приложение с библиотекой Prism (MVVM шаблон проектирования)
Создаем новое WPF приложение с Prism Unity (разделение проекта на папки Services, Views, ViewModels). Патерн MVVM (Model-View-ViewModel) | C#
WPF приложение с Prism Unity. В приложении Tab и разделения на отдельные xaml используя Region.
WPF приложение с Locator (MVVM шаблон проектирования)
Создаем новое WPF приложение с Locator (разделение проекта на папки Views, ViewModels)
Как добавить Dependency Injection, загрузку из appsettings.json в новом WPF приложении ?
Автоматические тесты
Пишем автоматический тест для WPF C# приложения (используем Nuget.Appium и свойство AutomationProperties.AutomationId)
Вопросы на собеседованиях
В чем отличие static resource от dynamic resource ? | WPF C#
Дополнительные темы, вопросы
Открываем окно свойств (properties) для графического элемента в WPF приложении C#
Ошибки
Ошибка "To run this application, you must install .NET. Would you like to download it now?" | Запускаю WPF приложение на C#
Книги
Книги для изучения WPF

  Ваши вопросы присылайте по почте: info@dir.by  
Яндекс.Метрика