using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ComPDFKit.Controls.Helper;
namespace ComPDFKit.Controls.PDFControl
{
///
/// Interaction logic for FeaturesListControl.xaml
///
public partial class FeaturesListControl : UserControl, INotifyPropertyChanged
{
private int _currentIndex = 1;
public int CurrentIndex
{
get => _currentIndex;
set
{
if (UpdateProper(ref _currentIndex, value))
{
RefreshCurrentItems();
}
}
}
private int _totalIndex = 1;
public int TotalIndex
{
get => _totalIndex;
set
{
UpdateProper(ref _totalIndex, value);
}
}
private int _horizontalItemNumber = 1;
public int HorizontalItemNumber
{
get => _horizontalItemNumber;
set
{
if (UpdateProper(ref _horizontalItemNumber, value))
{
ResetTotalIndex();
}
}
}
private int _verticalItemNumber = 1;
public int VerticalItemNumber
{
get => _verticalItemNumber;
set
{
if (UpdateProper(ref _verticalItemNumber, value))
{
ResetTotalIndex();
}
}
}
private ObservableCollection _pageItems = new ObservableCollection();
public ObservableCollection PageItems
{
get => _pageItems;
set
{
UpdateProper(ref _pageItems, value);
}
}
public event EventHandler SelectionChanged;
public event PropertyChangedEventHandler PropertyChanged;
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register("Items", typeof(ObservableCollection), typeof(FeaturesListControl), new PropertyMetadata(null));
public ObservableCollection Items
{
get { return (ObservableCollection)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public FeaturesListControl()
{
this.DataContext = this;
InitializeComponent();
Items = new ObservableCollection();
FeaturesListTxb.Text = LanguageHelper.CommonManager.GetString("Title_Features");
}
private void FeaturesListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var listBox = sender as ListBox;
if (listBox != null && listBox.SelectedIndex != -1)
{
SelectionChanged?.Invoke(sender, Items[HorizontalItemNumber*VerticalItemNumber*(CurrentIndex-1) + listBox.SelectedIndex]);
listBox.SelectedIndex = -1;
}
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
FeaturesListBox.SelectionChanged += FeaturesListBox_SelectionChanged;
ResetTotalIndex();
}
private void ResetTotalIndex()
{
if (this.IsLoaded)
{
if (FeaturesListBox != null && HorizontalItemNumber != 0 && VerticalItemNumber != 0)
{
int totalIndex = Items.Count / (HorizontalItemNumber * VerticalItemNumber);
if (Items.Count % (HorizontalItemNumber * VerticalItemNumber) != 0)
{
TotalIndex = totalIndex + 1;
}
else
{
TotalIndex = totalIndex;
}
if (CurrentIndex > TotalIndex)
{
CurrentIndex = TotalIndex;
}
RefreshCurrentItems();
}
}
}
private void RefreshCurrentItems()
{
if (this.IsLoaded)
{
PageItems.Clear();
int baseItemIndex = (CurrentIndex - 1) * HorizontalItemNumber * VerticalItemNumber;
for (int ItemIndex = baseItemIndex;
ItemIndex < baseItemIndex + HorizontalItemNumber * VerticalItemNumber && ItemIndex < Items.Count;
ItemIndex++)
{
PageItems.Add(Items[ItemIndex]);
}
}
}
private void PrePageBtn_Click(object sender, RoutedEventArgs e)
{
if (CurrentIndex > 1)
{
CurrentIndex--;
}
}
private void NextPageBtn_Click(object sender, RoutedEventArgs e)
{
if (CurrentIndex < TotalIndex)
{
CurrentIndex++;
}
}
protected bool UpdateProper(ref T properValue,
T newValue,
[CallerMemberName] string properName = "")
{
if (object.Equals(properValue, newValue))
return false;
properValue = newValue;
OnPropertyChanged(properName);
return true;
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private void ListGd_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (FeaturesListBox != null && CustomItem.ItemWidth > 0 && CustomItem.ItemHeight > 0)
{
HorizontalItemNumber = (int)((FeaturesListBox.ActualWidth) / (CustomItem.ItemWidth + 2 * CustomItem.ItemMargin));
VerticalItemNumber = (int)((FeaturesListBox.ActualHeight) / (CustomItem.ItemHeight + 2 * CustomItem.ItemMargin));
}
}
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
{
FeaturesListBox.SelectionChanged -= FeaturesListBox_SelectionChanged;
}
}
public class CustomItem : Control, INotifyPropertyChanged
{
static public double ItemWidth { get; set; } = 400;
static public double ItemHeight { get; set; } = 128;
static public double ItemMargin { get; set; } = 10;
public string Feature;
private string _titleText;
public string TitleText
{
get => _titleText;
set
{
UpdateProper(ref _titleText, value);
}
}
private Canvas _iconCanvas;
public Canvas IconCanvas
{
get => _iconCanvas;
set
{
UpdateProper(ref _iconCanvas, value);
}
}
private string _descriptionText;
public string DescriptionText
{
get => _descriptionText;
set
{
UpdateProper(ref _descriptionText, value);
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void UpdateProper(ref T properValue,
T newValue,
[CallerMemberName] string properName = "")
{
if (object.Equals(properValue, newValue))
return;
properValue = newValue;
OnPropertyChanged(properName);
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}