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(); } } }