FeaturesListControl.xaml.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. using System.Runtime.CompilerServices;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows;
  10. using System.Windows.Controls;
  11. using System.Windows.Data;
  12. using System.Windows.Documents;
  13. using System.Windows.Input;
  14. using System.Windows.Media;
  15. using System.Windows.Media.Imaging;
  16. using System.Windows.Navigation;
  17. using System.Windows.Shapes;
  18. namespace Compdfkit_Tools.PDFControl
  19. {
  20. /// <summary>
  21. /// Interaction logic for FeaturesListControl.xaml
  22. /// </summary>
  23. public partial class FeaturesListControl : UserControl, INotifyPropertyChanged
  24. {
  25. private int _currentIndex = 1;
  26. public int CurrentIndex
  27. {
  28. get => _currentIndex;
  29. set
  30. {
  31. if (UpdateProper(ref _currentIndex, value))
  32. {
  33. RefreshCurrentItems();
  34. }
  35. }
  36. }
  37. private int _totalIndex = 1;
  38. public int TotalIndex
  39. {
  40. get => _totalIndex;
  41. set
  42. {
  43. UpdateProper(ref _totalIndex, value);
  44. }
  45. }
  46. private int _horizontalItemNumber = 1;
  47. public int HorizontalItemNumber
  48. {
  49. get => _horizontalItemNumber;
  50. set
  51. {
  52. if (UpdateProper(ref _horizontalItemNumber, value))
  53. {
  54. ResetTotalIndex();
  55. }
  56. }
  57. }
  58. private int _verticalItemNumber = 1;
  59. public int VerticalItemNumber
  60. {
  61. get => _verticalItemNumber;
  62. set
  63. {
  64. if (UpdateProper(ref _verticalItemNumber, value))
  65. {
  66. ResetTotalIndex();
  67. }
  68. }
  69. }
  70. private ObservableCollection<CustomItem> _pageItems = new ObservableCollection<CustomItem>();
  71. public ObservableCollection<CustomItem> PageItems
  72. {
  73. get => _pageItems;
  74. set
  75. {
  76. UpdateProper(ref _pageItems, value);
  77. }
  78. }
  79. public event EventHandler<CustomItem> SelectionChanged;
  80. public event PropertyChangedEventHandler PropertyChanged;
  81. public static readonly DependencyProperty ItemsProperty =
  82. DependencyProperty.Register("Items", typeof(ObservableCollection<CustomItem>), typeof(FeaturesListControl), new PropertyMetadata(null));
  83. public ObservableCollection<CustomItem> Items
  84. {
  85. get { return (ObservableCollection<CustomItem>)GetValue(ItemsProperty); }
  86. set { SetValue(ItemsProperty, value); }
  87. }
  88. public FeaturesListControl()
  89. {
  90. this.DataContext = this;
  91. InitializeComponent();
  92. Items = new ObservableCollection<CustomItem>();
  93. }
  94. private void FeaturesListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
  95. {
  96. var listBox = sender as ListBox;
  97. if (listBox != null && listBox.SelectedIndex != -1)
  98. {
  99. SelectionChanged?.Invoke(sender, Items[HorizontalItemNumber*VerticalItemNumber*(CurrentIndex-1) + listBox.SelectedIndex]);
  100. listBox.SelectedIndex = -1;
  101. }
  102. }
  103. private void UserControl_Loaded(object sender, RoutedEventArgs e)
  104. {
  105. FeaturesListBox.SelectionChanged += FeaturesListBox_SelectionChanged;
  106. ResetTotalIndex();
  107. }
  108. private void ResetTotalIndex()
  109. {
  110. if (this.IsLoaded)
  111. {
  112. if (FeaturesListBox != null && HorizontalItemNumber != 0 && VerticalItemNumber != 0)
  113. {
  114. int totalIndex = Items.Count / (HorizontalItemNumber * VerticalItemNumber);
  115. if (Items.Count % (HorizontalItemNumber * VerticalItemNumber) != 0)
  116. {
  117. TotalIndex = totalIndex + 1;
  118. }
  119. else
  120. {
  121. TotalIndex = totalIndex;
  122. }
  123. if (CurrentIndex > TotalIndex)
  124. {
  125. CurrentIndex = TotalIndex;
  126. }
  127. RefreshCurrentItems();
  128. }
  129. }
  130. }
  131. private void RefreshCurrentItems()
  132. {
  133. if (this.IsLoaded)
  134. {
  135. PageItems.Clear();
  136. int baseItemIndex = (CurrentIndex - 1) * HorizontalItemNumber * VerticalItemNumber;
  137. for (int ItemIndex = baseItemIndex;
  138. ItemIndex < baseItemIndex + HorizontalItemNumber * VerticalItemNumber && ItemIndex < Items.Count;
  139. ItemIndex++)
  140. {
  141. PageItems.Add(Items[ItemIndex]);
  142. }
  143. }
  144. }
  145. private void PrePageBtn_Click(object sender, RoutedEventArgs e)
  146. {
  147. if (CurrentIndex > 1)
  148. {
  149. CurrentIndex--;
  150. }
  151. }
  152. private void NextPageBtn_Click(object sender, RoutedEventArgs e)
  153. {
  154. if (CurrentIndex < TotalIndex)
  155. {
  156. CurrentIndex++;
  157. }
  158. }
  159. protected bool UpdateProper<T>(ref T properValue,
  160. T newValue,
  161. [CallerMemberName] string properName = "")
  162. {
  163. if (object.Equals(properValue, newValue))
  164. return false;
  165. properValue = newValue;
  166. OnPropertyChanged(properName);
  167. return true;
  168. }
  169. protected void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
  170. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  171. private void ListGd_SizeChanged(object sender, SizeChangedEventArgs e)
  172. {
  173. if (FeaturesListBox != null && CustomItem.ItemWidth > 0 && CustomItem.ItemHeight > 0)
  174. {
  175. HorizontalItemNumber = (int)((FeaturesListBox.ActualWidth) / (CustomItem.ItemWidth + 2 * CustomItem.ItemMargin));
  176. VerticalItemNumber = (int)((FeaturesListBox.ActualHeight) / (CustomItem.ItemHeight + 2 * CustomItem.ItemMargin));
  177. }
  178. }
  179. private void UserControl_Unloaded(object sender, RoutedEventArgs e)
  180. {
  181. FeaturesListBox.SelectionChanged -= FeaturesListBox_SelectionChanged;
  182. }
  183. }
  184. public class CustomItem : Control, INotifyPropertyChanged
  185. {
  186. static public double ItemWidth { get; set; } = 400;
  187. static public double ItemHeight { get; set; } = 128;
  188. static public double ItemMargin { get; set; } = 10;
  189. private string _titleText;
  190. public string TitleText
  191. {
  192. get => _titleText;
  193. set
  194. {
  195. UpdateProper(ref _titleText, value);
  196. }
  197. }
  198. private Canvas _iconCanvas;
  199. public Canvas IconCanvas
  200. {
  201. get => _iconCanvas;
  202. set
  203. {
  204. UpdateProper(ref _iconCanvas, value);
  205. }
  206. }
  207. private string _descriptionText;
  208. public string DescriptionText
  209. {
  210. get => _descriptionText;
  211. set
  212. {
  213. UpdateProper(ref _descriptionText, value);
  214. }
  215. }
  216. public event PropertyChangedEventHandler PropertyChanged;
  217. protected void UpdateProper<T>(ref T properValue,
  218. T newValue,
  219. [CallerMemberName] string properName = "")
  220. {
  221. if (object.Equals(properValue, newValue))
  222. return;
  223. properValue = newValue;
  224. OnPropertyChanged(properName);
  225. }
  226. protected void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
  227. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  228. }
  229. }