using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
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;
namespace compdfkit_tools.PDFControlUI
{
public partial class CPDFBookmarkResultUI : UserControl
{
///
/// 书签列表点击选中更改事件
///
public event EventHandler SelectionChanged;
///
/// 书签删除点击事件
///
public event EventHandler BookmarkDelete;
///
/// 书签修改点击事件
///
public event EventHandler BookmarkEdit;
///
/// 点击书签事件
///
public event EventHandler BookmarkClicked;
///
/// 绑定书签结果集合
///
private ObservableCollection bookmarkResults;
public CPDFBookmarkResultUI()
{
InitializeComponent();
bookmarkResults = new ObservableCollection();
ICollectionView groupView = CollectionViewSource.GetDefaultView(bookmarkResults);
groupView.GroupDescriptions.Add(new PropertyGroupDescription(nameof(BookmarkBindData.ShowPageIndex)));
}
///
/// 鼠标移入事件 用以控制展示右侧编辑删除面板
///
private void Grid_MouseEnter(object sender, MouseEventArgs e)
{
Grid sourceGrid=sender as Grid;
if(sourceGrid!=null && sourceGrid.Children.Count==2)
{
Border sourceBorder = sourceGrid.Children[1] as Border;
if(sourceBorder!=null)
{
sourceBorder.Visibility = Visibility.Visible;
}
}
}
///
/// 鼠标移出事件 用以控制隐藏右侧编辑 删除面板
///
private void Grid_MouseLeave(object sender, MouseEventArgs e)
{
Grid sourceGrid = sender as Grid;
if (sourceGrid != null && sourceGrid.Children.Count == 2)
{
Border sourceBorder = sourceGrid.Children[1] as Border;
if (sourceBorder != null)
{
sourceBorder.Visibility = Visibility.Collapsed;
}
}
}
///
/// 编辑按钮点击事件 启用书签文本编辑
///
private void EditBorder_Click(object sender, RoutedEventArgs e)
{
Border sourceBtn =sender as Border;
if(sourceBtn != null)
{
DependencyObject findElement = null;
if (FindParent(sourceBtn, out findElement) && findElement != null)
{
Grid sourceGrid = findElement as Grid;
BookmarkBindData bindData = sourceGrid.Tag as BookmarkBindData;
if (bindData != null)
{
BookmarkEdit?.Invoke(this, new BookmarkChangeData()
{
PageIndex = bindData.BindProperty.PageIndex,
BookmarkTitle = bindData.BindProperty.BookmarkTitle,
BindData= bindData
});
}
}
}
e.Handled = true;
}
///
/// 删除按钮点击事件 触发删除事件通知
///
private void DelBorder_Click(object sender, RoutedEventArgs e)
{
Border sourceBtn = sender as Border;
if (sourceBtn != null)
{
DependencyObject findElement = null;
if (FindParent(sourceBtn, out findElement) && findElement != null)
{
Grid sourceGrid = findElement as Grid;
BookmarkBindData bindData = sourceGrid.Tag as BookmarkBindData;
if (bindData != null)
{
BookmarkDelete?.Invoke(this, new BookmarkChangeData()
{
PageIndex = bindData.BindProperty.PageIndex,
BookmarkTitle = bindData.BindProperty.BookmarkTitle
});
bookmarkResults?.Remove(bindData);
if(bookmarkResults.Count==0)
{
NoResultText.Visibility = Visibility.Visible;
}
}
}
}
e.Handled = true;
}
///
/// 递归查询指定类型的父节点元素
///
/// 父元素节点类型
/// 要查找的元素
/// 查找到的父节点元素
/// 查找到对应类型父节点元素则为true
private bool FindParent(DependencyObject checkElement,out DependencyObject parent)
{
parent = null;
try
{
if (checkElement != null)
{
DependencyObject parentElement= VisualTreeHelper.GetParent(checkElement);
if(parentElement!=null && parentElement is T)
{
parent =parentElement;
return true;
}
return FindParent(parentElement,out parent);
}
}
catch (Exception ex)
{
}
return false;
}
///
/// 将书签列表绑定到UI控件
///
public void SetBookmarkResult(List results)
{
bookmarkResults?.Clear();
if (results == null || results.Count == 0)
{
ResultListControl.ItemsSource = null;
NoResultText.Visibility= Visibility.Visible;
return;
}
foreach (BindBookmarkResult item in results)
{
bookmarkResults.Add(new BookmarkBindData()
{
BindProperty = item
});
}
ResultListControl.ItemsSource = bookmarkResults;
NoResultText.Visibility = Visibility.Collapsed;
}
///
/// 获取选中书签结果
///
/// 搜索结果
public BindBookmarkResult GetSelectItem()
{
BookmarkBindData bindData = ResultListControl.SelectedItem as BookmarkBindData;
if (bindData != null)
{
return bindData.BindProperty;
}
return null;
}
///
/// 获取指定索引书签对象
///
/// 指定索引
///
public BindBookmarkResult GetItem(int index)
{
if (index < 0)
{
return null;
}
if (ResultListControl.HasItems && ResultListControl.Items.Count > index)
{
BookmarkBindData bindData = ResultListControl.Items[index] as BookmarkBindData;
if (bindData != null)
{
return bindData.BindProperty;
}
}
return null;
}
///
/// 清除选中结果
///
public void ClearSelection()
{
int oldSelectionIndex = ResultListControl.SelectedIndex;
ResultListControl.UnselectAll();
if (oldSelectionIndex != ResultListControl.SelectedIndex)
{
SelectionChanged?.Invoke(this,ResultListControl.SelectedIndex);
}
}
///
/// 设置选中结果
///
/// 选中索引
public void SelectItem(int selectIndex)
{
if (ResultListControl.SelectedIndex != selectIndex)
{
ResultListControl.SelectedIndex = selectIndex;
}
}
///
/// 书签列表选中改变事件
///
private void ResultListControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
SelectionChanged?.Invoke(this, ResultListControl.SelectedIndex);
}
///
/// 书签列表点击书签事件
///
private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Grid sourceGrid = sender as Grid;
if (sourceGrid != null)
{
BookmarkBindData bindData = sourceGrid.Tag as BookmarkBindData;
if (bindData != null)
{
BookmarkClicked?.Invoke(this, bindData.BindProperty.PageIndex);
}
}
}
///
/// 点击空白清除选中项
///
private void ResultListControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ResultListControl?.UnselectAll();
}
}
public class BookmarkChangeData
{
///
/// 页面索引
///
public int PageIndex { get; set; }
///
/// 原书签标题
///
public string BookmarkTitle { get; set; }
///
/// 修改后的标题
///
public string NewTitle { get;set; }
public object BindData { get; set; }
}
public class BindBookmarkResult:INotifyPropertyChanged
{
private int _pageIndex;
///
/// 页面索引
///
public int PageIndex
{
get
{
return _pageIndex;
}
set
{
if(_pageIndex != value)
{
_pageIndex = value;
OnPropertyChanged(nameof(PageIndex));
}
}
}
private string _bookmarkTitle;
///
/// 书签标题
///
public string BookmarkTitle
{
get
{
return _bookmarkTitle;
}
set
{
if(_bookmarkTitle != value)
{
_bookmarkTitle = value;
OnPropertyChanged(nameof(BookmarkTitle));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
internal class BookmarkBindData
{
public int ShowPageIndex { get { return BindProperty.PageIndex + 1; } set { BindProperty.PageIndex = value; } }
public BindBookmarkResult BindProperty { get; set; }
public BookmarkBindData()
{
BindProperty = new BindBookmarkResult();
}
}
}