Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Создание анимации с помощью таймера
В данном разделе рассмотрим создание простейшей анимации без использования специальных классов для анимации, таких как Vector3DAnimation, Vector3DAnimationUsingKeyFrames и пр. Анимация будет создаваться с помощью таймера. Для работы с таймером в WPF используется класс DispatcherTimer, который инициализируется в процедурном коде следующим образом.
MyTimer = new DispatcherTimer(); MyTimer.Tick += new EventHandler(MyTimer_Tick); MyTimer.Interval = new TimeSpan(100000);
Свойство Interval определяет частоту срабатывания таймера. Через свойство Tick определяется метод (в нашем случае MyTimer_Tick), который будет запускаться по тику таймера. Метод, запускающийся по тику таймера, например, можно описать следующим образом.
private void MyTimer_Tick(object sender, EventArgs e) { }
Для запуска и остановки таймера необходимо использовать его методы Start() и Stop(). Для задания различных трехмерных преобразований к различным объектом не только описываются разные 3D модели, но и создаются различные объекты из класса Transform3D. Рассмотрим пример поворота двух граней вокруг осей y и z в разных направлениях. При описании 3D моделей в отличие от предыдущего примера добавим описание цвета обратной стороны грани. XAML описание для элемента Viewport3D будет следующее.
< Viewport3D ClipToBounds=" True" Width=" 300" Margin=" 102, 0, 102, 71" >
<! -- Определяем положение и направление камеры. --> < Viewport3D.Camera> < PerspectiveCamera Position=" 0, 0, 2" LookDirection=" 0, 0, -1" FieldOfView=" 45" /> < /Viewport3D.Camera>
<! -- Определяем дочернии объекты для Viewport3D --> < Viewport3D.Children>
<! -- Устанавливаем направления и цвет источника освещения. --> < ModelVisual3D> < ModelVisual3D.Content> < DirectionalLight Color=" #FFFFFF" Direction=" -1, -1, -1" /> < /ModelVisual3D.Content> < /ModelVisual3D>
<! -- Определяем первую 3D модель --> < ModelVisual3D x: Name=" MyModel" > < ModelVisual3D.Content> < GeometryModel3D>
<! -- Определяем 3D объект --> < GeometryModel3D.Geometry> < MeshGeometry3D TriangleIndices=" 0, 1, 2" Positions=" -0.1, -0.1, 0.1 0.1, -0.1, 0.1 0.1, 0.1, 0.1" > < /MeshGeometry3D> < /GeometryModel3D.Geometry>
<! -- Зададим материал (цвет) объекта --> < GeometryModel3D.Material> < MaterialGroup> < DiffuseMaterial Brush=" Blue" /> < /MaterialGroup> < /GeometryModel3D.Material>
<! -- Зададим цвет обратной стороны --> < GeometryModel3D.BackMaterial> < MaterialGroup> < DiffuseMaterial Brush=" Green" /> < /MaterialGroup> < /GeometryModel3D.BackMaterial>
<! -- Перенесем объект влево --> < GeometryModel3D.Transform> < TranslateTransform3D OffsetX=" -0.5" /> < /GeometryModel3D.Transform>
< /GeometryModel3D> < /ModelVisual3D.Content> < /ModelVisual3D>
<! -- Определяем вторую 3D модель --> < ModelVisual3D x: Name=" MyModel2" > < ModelVisual3D.Content> < GeometryModel3D>
<! -- Определяем 3D объект --> < GeometryModel3D.Geometry> < MeshGeometry3D TriangleIndices=" 0, 1, 2" Positions=" -0.1, -0.1, 0.1 0.1, -0.1, 0.1 0.1, 0.1, 0.1" > < /MeshGeometry3D> < /GeometryModel3D.Geometry>
<! -- Зададим материал (цвет) объекта --> < GeometryModel3D.Material> < MaterialGroup> < DiffuseMaterial Brush=" Red" /> < /MaterialGroup> < /GeometryModel3D.Material>
<! -- Зададим цвет обратной стороны --> < GeometryModel3D.BackMaterial> < MaterialGroup> < DiffuseMaterial Brush=" Yellow" /> < /MaterialGroup> < /GeometryModel3D.BackMaterial>
<! -- Перенесем объект вправо --> < GeometryModel3D.Transform> < TranslateTransform3D OffsetX=" 0.5" /> < /GeometryModel3D.Transform>
< /GeometryModel3D> < /ModelVisual3D.Content> < /ModelVisual3D>
< /Viewport3D.Children>
< /Viewport3D>
Обработчик события Loaded будет выглядеть следующим образом.
private void Window_Loaded(object sender, RoutedEventArgs e) { //Создаем преобразования для 1 объекта myYRotate = new RotateTransform3D(); myYAxis = new AxisAngleRotation3D(); myYAxis.Axis = new Vector3D(0, 1, 0); myYAxis.Angle = 0; myYRotate.Rotation = myYAxis;
myZRotate = new RotateTransform3D(); myZAxis = new AxisAngleRotation3D(); myZAxis.Axis = new Vector3D(0, 0, 1); myZAxis.Angle = 0; myZRotate.Rotation = myZAxis;
myTransform1 = new Transform3DGroup(); MyModel.Transform = myTransform1;
myTransform1.Children.Add(myYRotate); myTransform1.Children.Add(myZRotate);
//Создаем преобразования для 2 объекта myYRotate2 = new RotateTransform3D(); myYAxis2 = new AxisAngleRotation3D(); myYAxis2.Axis = new Vector3D(0, 1, 0); myYAxis2.Angle = 0; myYRotate2.Rotation = myYAxis2;
myZRotate2 = new RotateTransform3D(); myZAxis2 = new AxisAngleRotation3D(); myZAxis2.Axis = new Vector3D(0, 0, 1); myZAxis2.Angle = 0; myZRotate2.Rotation = myZAxis2;
myTransform2 = new Transform3DGroup(); MyModel2.Transform = myTransform2;
myTransform2.Children.Add(myYRotate2); myTransform2.Children.Add(myZRotate2);
// Подготоваливаем таймер к работа MyTimer = new DispatcherTimer(); MyTimer.Tick += new EventHandler(MyTimer_Tick); MyTimer.Interval = new TimeSpan(100000); }
Тик таймера выглядит следующим образом.
private void MyTimer_Tick(object sender, EventArgs e) { myYAxis.Angle += 1; myZAxis.Angle += 1;
myYAxis2.Angle -= 2; myZAxis2.Angle -= 2; }
Остается добавить две кнопки для запуска и остановки таймера и их обработчики.
private void button1_Click(object sender, RoutedEventArgs e) { MyTimer.Start(); }
private void button2_Click(object sender, RoutedEventArgs e) { MyTimer.Stop(); }
|