using Avalonia.Controls; using Avalonia.Controls.Shapes; using Avalonia.Media; using Avalonia.Threading; using AvaloniaMVVM.Models; using ReactiveUI; using System; using System.Collections.Generic; namespace AvaloniaMVVM.ViewModels { public class MainWindowViewModel : ViewModelBase { DispatcherTimer timer = new DispatcherTimer(); // создание объекта для таймера // конструктор public MainWindowViewModel() { timer.Interval = new TimeSpan(0, 0, 5); // задание того, на какое кол-во времени будет запущен таймер timer.Tick += new EventHandler(timer_tick); // добавление объекту таймера событие, запускающего генерацию капчи (обработчик timer_tick реализован ниже) } #region Реализация паттерна // свойство для отображения значения числового поля и изменения его при увеличении значения числового поля: public int Count { get => ModelClass.count; set => this.RaiseAndSetIfChanged(ref ModelClass.count, value); } // свойство для отображения фамилий в раскрывающемся списке public List SurnameList => ModelClass.surnameList; // свойство для отображения изначально выбранного значеия в списке public string SelectedSurname => ModelClass.surnameList[0]; public void AddCount() // метод, который увеличивает числовое значение { Count++; } #endregion #region Генерация капчи Canvas _can; // изначально контейнер Canvas пустой // свойтсво, которое отображает созданный контейнер Canvas в UserControl public Canvas Can { get => _can; set => this.RaiseAndSetIfChanged(ref _can, value); } // событие, которое происходит после истечения времени таймера private void timer_tick(object sender, EventArgs e) { CreateCaptha(); } // метод для создания Canvas, внутри которого рандомно генерируются линии и цифры public void CreateCaptha() { Random rnd = new Random(); SolidColorBrush color = new SolidColorBrush(Color.FromRgb(Convert.ToByte(rnd.Next(256)), Convert.ToByte(rnd.Next(255)), Convert.ToByte(rnd.Next(255)))); Canvas canvas = new Canvas() // создаем размеры Canvas { Width = 400, Height = 400, Background = color }; // генерируем линии for (int i=0; i<3; i++) { TextBlock number = new TextBlock() { Text = rnd.Next(10).ToString(), FontSize = 150, Foreground = Brushes.Black, Padding = new Avalonia.Thickness(rnd.Next(100), rnd.Next(50)) }; canvas.Children.Add(number); } // генерируем числа for (int i=0; i<20; i++) { Line line = new Line() { StartPoint = new Avalonia.Point(rnd.Next(400), rnd.Next(400)), EndPoint = new Avalonia.Point(rnd.Next(400), rnd.Next(400)), Stroke = Brushes.White, StrokeThickness = 3 }; canvas.Children.Add(line); } timer.Start(); // запуск таймера Can = canvas; // передача созданного Canvas св-ву Canvas для отображения } #endregion } }