MobileToolGrid.xaml.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Globalization;
  5. using System.Linq;
  6. using Xamarin.Forms;
  7. using Xamarin.Forms.Xaml;
  8. namespace InABox.Mobile
  9. {
  10. public class ToolGridLayoutChangedEventArgs : EventArgs
  11. {
  12. public int RowCount { get; private set; }
  13. public int ColCount { get; private set; }
  14. public ToolGridLayoutChangedEventArgs(int rowcount, int colcount)
  15. {
  16. RowCount = rowcount;
  17. ColCount = colcount;
  18. }
  19. }
  20. public delegate void ToolGridLayoutChangedEvent(object sender, ToolGridLayoutChangedEventArgs args);
  21. public class ToolGridViewModel : BindableObject
  22. {
  23. public IList<IMobileToolItem> Items { get; private set; }
  24. public IList<IMobileToolItem> VisibleItems { get; private set; }
  25. public int Columns { get; set; }
  26. public ToolGridViewModel()
  27. {
  28. Columns = 4;
  29. Items = new ObservableCollection<IMobileToolItem>();
  30. VisibleItems = new ObservableCollection<IMobileToolItem>();
  31. ((ObservableCollection<IMobileToolItem>)Items).CollectionChanged += (sender, args) =>
  32. {
  33. VisibleItems.Clear();
  34. DoLayout();
  35. };
  36. }
  37. private void DoLayout()
  38. {
  39. int iRow = 0;
  40. int iCol = 0;
  41. foreach (var item in Items.Where(x => x.IsVisible))
  42. {
  43. item.Row = iRow;
  44. item.Column = iCol;
  45. VisibleItems.Add(item);
  46. iCol++;
  47. if (iCol == Columns)
  48. {
  49. iRow++;
  50. iCol = 0;
  51. }
  52. }
  53. LayoutChanged?.Invoke(this,new ToolGridLayoutChangedEventArgs(iRow,Columns));
  54. }
  55. public Color BackgroundColor { get; set; }
  56. public event ToolGridLayoutChangedEvent LayoutChanged;
  57. }
  58. [XamlCompilation(XamlCompilationOptions.Compile)]
  59. public partial class MobileToolGrid
  60. {
  61. public IList<IMobileToolItem> Items => _viewModel.Items;
  62. public MobileToolGrid()
  63. {
  64. InitializeComponent();
  65. BindableLayout.SetItemsSource(_flexgrid, _viewModel.VisibleItems);
  66. }
  67. private void ImageTapped(object sender, EventArgs e)
  68. {
  69. if ((sender is Image image) && (image.BindingContext is MobileMobileToolItem item) && item.IsEnabled)
  70. item.DoTap();
  71. }
  72. private void _viewModel_OnLayoutChanged(object sender, ToolGridLayoutChangedEventArgs args)
  73. {
  74. _flexgrid.RowDefinitions.Clear();
  75. for (int i=0; i< args.RowCount; i++)
  76. _flexgrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto});
  77. _flexgrid.ColumnDefinitions.Clear();
  78. for (int i=0; i< args.ColCount; i++)
  79. _flexgrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = GridLength.Star});
  80. }
  81. }
  82. }