MainWindowViewModel.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using Avalonia.Controls;
  2. using Avalonia.Controls.Shapes;
  3. using Avalonia.Media;
  4. using Avalonia.Threading;
  5. using AvaloniaMVVM.Models;
  6. using ReactiveUI;
  7. using System;
  8. using System.Collections.Generic;
  9. namespace AvaloniaMVVM.ViewModels
  10. {
  11. public class MainWindowViewModel : ViewModelBase
  12. {
  13. DispatcherTimer timer = new DispatcherTimer(); // создание объекта для таймера
  14. // конструктор
  15. public MainWindowViewModel()
  16. {
  17. timer.Interval = new TimeSpan(0, 0, 5); // задание того, на какое кол-во времени будет запущен таймер
  18. timer.Tick += new EventHandler(timer_tick); // добавление объекту таймера событие, запускающего генерацию капчи (обработчик timer_tick реализован ниже)
  19. }
  20. #region Реализация паттерна
  21. // свойство для отображения значения числового поля и изменения его при увеличении значения числового поля:
  22. public int Count
  23. {
  24. get => ModelClass.count;
  25. set => this.RaiseAndSetIfChanged(ref ModelClass.count, value);
  26. }
  27. // свойство для отображения фамилий в раскрывающемся списке
  28. public List<string> SurnameList => ModelClass.surnameList;
  29. // свойство для отображения изначально выбранного значеия в списке
  30. public string SelectedSurname => ModelClass.surnameList[0];
  31. public void AddCount() // метод, который увеличивает числовое значение
  32. {
  33. Count++;
  34. }
  35. #endregion
  36. #region Генерация капчи
  37. Canvas _can; // изначально контейнер Canvas пустой
  38. // свойтсво, которое отображает созданный контейнер Canvas в UserControl
  39. public Canvas Can
  40. {
  41. get => _can;
  42. set => this.RaiseAndSetIfChanged(ref _can, value);
  43. }
  44. // событие, которое происходит после истечения времени таймера
  45. private void timer_tick(object sender, EventArgs e)
  46. {
  47. CreateCaptha();
  48. }
  49. // метод для создания Canvas, внутри которого рандомно генерируются линии и цифры
  50. public void CreateCaptha()
  51. {
  52. Random rnd = new Random();
  53. SolidColorBrush color = new SolidColorBrush(Color.FromRgb(Convert.ToByte(rnd.Next(256)), Convert.ToByte(rnd.Next(255)), Convert.ToByte(rnd.Next(255))));
  54. Canvas canvas = new Canvas() // создаем размеры Canvas
  55. {
  56. Width = 400,
  57. Height = 400,
  58. Background = color
  59. };
  60. // генерируем линии
  61. for (int i=0; i<3; i++)
  62. {
  63. TextBlock number = new TextBlock()
  64. {
  65. Text = rnd.Next(10).ToString(),
  66. FontSize = 150,
  67. Foreground = Brushes.Black,
  68. Padding = new Avalonia.Thickness(rnd.Next(100), rnd.Next(50))
  69. };
  70. canvas.Children.Add(number);
  71. }
  72. // генерируем числа
  73. for (int i=0; i<20; i++) {
  74. Line line = new Line()
  75. {
  76. StartPoint = new Avalonia.Point(rnd.Next(400), rnd.Next(400)),
  77. EndPoint = new Avalonia.Point(rnd.Next(400), rnd.Next(400)),
  78. Stroke = Brushes.White,
  79. StrokeThickness = 3
  80. };
  81. canvas.Children.Add(line);
  82. }
  83. timer.Start(); // запуск таймера
  84. Can = canvas; // передача созданного Canvas св-ву Canvas для отображения
  85. }
  86. #endregion
  87. }
  88. }