using DraggAnimatedPanelExample; using GeekDesk.Constant; using GeekDesk.Control.Other; using GeekDesk.Control.Windows; using GeekDesk.Util; using GeekDesk.ViewModel; using Microsoft.Win32; using System; using System.Collections.ObjectModel; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Threading; using WindowsAPICodePack.Dialogs; namespace GeekDesk.Control.UserControls.PannelCard { /// /// LeftCardControl.xaml 的交互逻辑 /// public partial class LeftCardControl : UserControl { private int menuSelectIndexTemp = -1; private AppData appData = MainWindow.appData; private SolidColorBrush bac = new SolidColorBrush(Color.FromRgb(255, 255, 255)); public LeftCardControl() { InitializeComponent(); bac.Opacity = 0.6; this.Loaded += (s, e) => { SelectLastMenu(); SetMenuListBoxItemEvent(); }; } private void SetMenuListBoxItemEvent() { int size = MenuListBox.Items.Count; for (int i = 0; i < size; i++) { ListBoxItem lbi = (ListBoxItem)(MenuListBox.ItemContainerGenerator.ContainerFromIndex(i)); if (lbi != null) { SetListBoxItemEvent(lbi); } } //首次触发不了Selected事件 object obj = MenuListBox.ItemContainerGenerator.ContainerFromIndex(MenuListBox.SelectedIndex); Lbi_Selected(obj, null); } private void SetListBoxItemEvent(ListBoxItem lbi) { lbi.MouseEnter += (s, me) => { lbi.Background = bac; }; lbi.Unselected += Lbi_Unselected; lbi.MouseLeave += Lbi_MouseLeave; lbi.Selected += Lbi_Selected; } private void SelectLastMenu() { if (appData.AppConfig.SelectedMenuIndex >= appData.MenuList.Count || appData.AppConfig.SelectedMenuIndex == -1) { MenuListBox.SelectedIndex = 0; appData.AppConfig.SelectedMenuIndex = MenuListBox.SelectedIndex; appData.AppConfig.SelectedMenuIcons = appData.MenuList[0].IconList; } else { MenuListBox.SelectedIndex = appData.AppConfig.SelectedMenuIndex; appData.AppConfig.SelectedMenuIcons = appData.MenuList[appData.AppConfig.SelectedMenuIndex].IconList; } } DelegateCommand _swap; public DelegateCommand SwapCommand { get { if (_swap == null) _swap = new DelegateCommand( (indexes) => { int fromS = indexes[0]; int to = indexes[1]; ObservableCollection menuList = MainWindow.appData.MenuList; var elementSource = menuList[to]; var dragged = menuList[fromS]; menuList.Remove(dragged); menuList.Insert(to, dragged); MenuListBox.SelectedIndex = to; MainWindow.appData.MenuList = menuList; } ); return _swap; } } /// /// 当修改菜单元素可见时 设置原菜单为不可见 并且不可选中 /// 修改菜单元素不可见时 原菜单可见 并 选中 /// /// /// private void MenuWhenVisibilityChanged(object sender, DependencyPropertyChangedEventArgs e) { StackPanel sp = sender as StackPanel; ListBoxItem lbi = (sp.TemplatedParent as ContentPresenter).TemplatedParent as ListBoxItem; if (sp.Visibility == Visibility.Collapsed) { lbi.MouseEnter += Lbi_MouseEnter; if (MenuListBox.SelectedIndex != -1) { menuSelectIndexTemp = MenuListBox.SelectedIndex; MenuListBox.SelectedIndex = -1; } else { MenuListBox.SelectedIndex = menuSelectIndexTemp; } } else { lbi.MouseEnter += (s, me) => { lbi.Background = bac; }; lbi.MouseLeave += Lbi_MouseLeave; lbi.Selected += Lbi_Selected; } } #region 设置菜单触发事件 private void Lbi_MouseEnter(object sender, MouseEventArgs e) { ListBoxItem lbi = sender as ListBoxItem; lbi.Background = Brushes.Transparent; } private void Lbi_Unselected(object sender, RoutedEventArgs e) { //添加Leave效果 ListBoxItem lbi = sender as ListBoxItem; lbi.Background = Brushes.Transparent; lbi.MouseLeave += Lbi_MouseLeave; } private void Lbi_Selected(object sender, RoutedEventArgs e) { try { ListBoxItem lbi = sender as ListBoxItem; SolidColorBrush fontColor = new SolidColorBrush(Colors.Black); lbi.MouseLeave -= Lbi_MouseLeave; lbi.Background = bac; lbi.Foreground = fontColor; } catch { } } private void Lbi_MouseLeave(object sender, MouseEventArgs e) { ListBoxItem lbi = sender as ListBoxItem; lbi.Background = Brushes.Transparent; } #endregion /// /// 新建菜单 /// /// /// private void CreateMenu(object sender, RoutedEventArgs e) { MenuInfo info = new MenuInfo() { MenuEdit = Visibility.Collapsed, MenuId = System.Guid.NewGuid().ToString(), MenuName = "NewMenu" }; appData.MenuList.Add(info); MenuListBox.SelectedIndex = appData.MenuList.Count - 1; appData.AppConfig.SelectedMenuIndex = MenuListBox.SelectedIndex; appData.AppConfig.SelectedMenuIcons = info.IconList; //首次触发不了Selected事件 object obj = MenuListBox.ItemContainerGenerator.ContainerFromIndex(MenuListBox.SelectedIndex); SetListBoxItemEvent((ListBoxItem)obj); Lbi_Selected(obj, null); } /// /// 创建实时文件菜单 /// /// /// private void CreateLinkMenu(object sender, RoutedEventArgs e) { try { CommonOpenFileDialog dialog = new CommonOpenFileDialog { IsFolderPicker = true, Title = "选择关联文件夹" }; if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { string menuId = System.Guid.NewGuid().ToString(); string path = dialog.FileName; MenuInfo menuInfo = new MenuInfo { MenuName = Path.GetFileNameWithoutExtension(path), MenuId = menuId, MenuType = MenuType.LINK, LinkPath = path, IsEncrypt = false, }; appData.MenuList.Add(menuInfo); MenuListBox.SelectedIndex = appData.MenuList.Count - 1; appData.AppConfig.SelectedMenuIndex = MenuListBox.SelectedIndex; appData.AppConfig.SelectedMenuIcons = menuInfo.IconList; //首次触发不了Selected事件 object obj = MenuListBox.ItemContainerGenerator.ContainerFromIndex(MenuListBox.SelectedIndex); SetListBoxItemEvent((ListBoxItem)obj); Lbi_Selected(obj, null); HandyControl.Controls.Growl.Success("菜单关联成功, 加载列表中, 稍后重新进入此菜单可查看列表!", "MainWindowGrowl"); FileWatcher.LinkMenuWatcher(menuInfo); new Thread(() => { DirectoryInfo dirInfo = new DirectoryInfo(menuInfo.LinkPath); FileSystemInfo[] fileInfos = dirInfo.GetFileSystemInfos(); ObservableCollection iconList = new ObservableCollection(); foreach (FileSystemInfo fileInfo in fileInfos) { IconInfo iconInfo = CommonCode.GetIconInfoByPath_NoWrite(fileInfo.FullName); iconList.Add(iconInfo); } this.Dispatcher.Invoke(() => { menuInfo.IconList = iconList; //foreach (IconInfo iconInfo in iconList) //{ // menuInfo.IconList = iconList; //} }); }).Start(); } } catch (Exception ex) { LogUtil.WriteErrorLog(ex, "新建关联菜单失败!"); HandyControl.Controls.Growl.WarningGlobal("新建关联菜单失败!"); } } /// /// 重命名菜单 将textbox 设置为可见 /// /// /// private void RenameMenu(object sender, RoutedEventArgs e) { RunTimeStatus.IS_MENU_EDIT = true; MenuInfo menuInfo = ((MenuItem)sender).Tag as MenuInfo; menuInfo.MenuEdit = (int)Visibility.Visible; } /// /// 删除菜单 /// /// /// private void DeleteMenu(object sender, RoutedEventArgs e) { MenuInfo menuInfo = ((MenuItem)sender).Tag as MenuInfo; if (menuInfo.IconList != null && menuInfo.IconList.Count > 0) { HandyControl.Controls.Growl.Ask("确认删除此菜单吗?", isConfirmed => { if (isConfirmed) { DeleteMenu(menuInfo); } return true; }, "MainWindowAskGrowl"); } else { DeleteMenu(menuInfo); } } private void DeleteMenu(MenuInfo menuInfo) { if (appData.MenuList.Count == 1) { //如果删除以后没有菜单的话 先创建一个 CreateMenu(null, null); } int index = appData.MenuList.IndexOf(menuInfo); if (index == 0) { index = 0; } else { index--; } appData.MenuList.Remove(menuInfo); // 选中下一个菜单 MenuListBox.SelectedIndex = index; appData.AppConfig.SelectedMenuIndex = MenuListBox.SelectedIndex; appData.AppConfig.SelectedMenuIcons = appData.MenuList[index].IconList; } /// /// 编辑菜单失焦或者敲下Enter键时保存修改后的菜单 /// /// /// private void LostFocusOrEnterDown(object sender, EventArgs e) { bool done = true; TextBox menuBox = null; if (e.GetType() == typeof(KeyEventArgs)) { KeyEventArgs eKey = e as KeyEventArgs; if (eKey.Key == Key.Enter) { menuBox = ((TextBox)sender); } else { done = false; } } else if (e.GetType() == typeof(RoutedEventArgs)) { menuBox = ((TextBox)sender); } if (done) { if (menuBox != null) { MenuInfo menuInfo = menuBox.Tag as MenuInfo; string text = menuBox.Text; menuInfo.MenuName = text; menuInfo.MenuEdit = Visibility.Collapsed; } RunTimeStatus.IS_MENU_EDIT = false; //为了解决无法修改菜单的问题 MainWindow.mainWindow.SearchBox.Focus(); MenuListBox.SelectedIndex = menuSelectIndexTemp; } } /// /// 当修改菜单元素可见时 设置全选并获得焦点 /// /// /// private void MenuEditWhenVisibilityChanged(object sender, DependencyPropertyChangedEventArgs e) { TextBox box = sender as TextBox; MenuInfo mi = box.Tag as MenuInfo; if (box.Visibility == Visibility.Visible) { Keyboard.Focus(box); box.SelectAll(); } } /// /// 修改菜单图标 /// /// /// private void EditMenuGeometry(object sender, RoutedEventArgs e) { MenuInfo menuInfo = ((MenuItem)sender).Tag as MenuInfo; IconfontWindow.Show(SvgToGeometry.GetIconfonts(), menuInfo); } private void Menu_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (RunTimeStatus.IS_MENU_EDIT) return; if (appData.AppConfig.ItemSpradeAnimation) { //是否启用列表展开动画 MainWindow.mainWindow.RightCard.WrapUFG.Visibility = Visibility.Collapsed; } //设置对应菜单的图标列表 if (MenuListBox.SelectedIndex == -1) { //appData.AppConfig.SelectedMenuIcons = appData.MenuList[appData.MenuList.Count - 1].IconList; } else { if (appData.MenuList[MenuListBox.SelectedIndex].IsEncrypt) { appData.AppConfig.SelectedMenuIcons = null; RunTimeStatus.SHOW_MENU_PASSWORDBOX = true; MainWindow.mainWindow.RightCard.PDDialog.Title.Text = "输入密码"; MainWindow.mainWindow.RightCard.PDDialog.type = PasswordType.INPUT; MainWindow.mainWindow.RightCard.PDDialog.Visibility = Visibility.Visible; } else { MainWindow.mainWindow.RightCard.PDDialog.Visibility = Visibility.Collapsed; appData.AppConfig.SelectedMenuIcons = appData.MenuList[MenuListBox.SelectedIndex].IconList; } } MainWindow.mainWindow.RightCard.WrapUFG.Visibility = Visibility.Visible; //App.DoEvents(); } /// /// 鼠标悬停切换菜单 /// /// /// private void Menu_MouseEnter(object sender, MouseEventArgs e) { if (appData.AppConfig.HoverMenu && !RunTimeStatus.IS_MENU_EDIT) { Thread t = new Thread(() => { Thread.Sleep(200); this.Dispatcher.Invoke(() => { ListBoxItem lbi = sender as ListBoxItem; if (lbi.IsMouseOver) { int index = MenuListBox.ItemContainerGenerator.IndexFromContainer(lbi); MenuListBox.SelectedIndex = index; if (appData.AppConfig.IconBatch_NoWrite) { appData.AppConfig.IconBatch_NoWrite = false; } } }); }); t.IsBackground = true; t.Start(); } } /// /// 点击菜单后 隐藏搜索框 /// /// /// private void ListBoxItem_MouseDown(object sender, MouseButtonEventArgs e) { if (RunTimeStatus.SEARCH_BOX_SHOW) { MainWindow.mainWindow.HidedSearchBox(); } ListBoxItem lbi = sender as ListBoxItem; MenuInfo mi = lbi.DataContext as MenuInfo; int index = MenuListBox.Items.IndexOf(mi); MenuListBox.SelectedIndex = index; if (appData.AppConfig.IconBatch_NoWrite) { appData.AppConfig.IconBatch_NoWrite = false; MainWindow.mainWindow.RightCard.IconListBox.SelectionMode = SelectionMode.Extended; } } ///// ///// 点击菜单后 隐藏搜索框 ///// ///// ///// //private void ListBoxItemPanel_MouseDown(object sender, MouseButtonEventArgs e) //{ // if (RunTimeStatus.SEARCH_BOX_SHOW) // { // MainWindow.mainWindow.HidedSearchBox(); // } // MenuInfo mi = (sender as StackPanel).Tag as MenuInfo; // int index = MenuListBox.Items.IndexOf(mi); // MenuListBox.SelectedIndex = index; //} /// /// 隐藏搜索框 /// /// /// private void MyCard_MouseDown(object sender, MouseButtonEventArgs e) { if (RunTimeStatus.SEARCH_BOX_SHOW) { MainWindow.mainWindow.HidedSearchBox(); } } private void Menu_MouseWheel(object sender, MouseWheelEventArgs e) { if (RunTimeStatus.IS_MENU_EDIT) return; ScrollViewer scrollViewer = ScrollUtil.FindSimpleVisualChild(MenuListBox); if (e.Delta < 0) { //判断是否到了最底部 if (ScrollUtil.IsBootomScrollView(scrollViewer)) { int index = MenuListBox.SelectedIndex; if (index < MenuListBox.Items.Count - 1) { index++; } else { index = 0; } MenuListBox.SelectedIndex = index; } } else if (e.Delta > 0) { if (ScrollUtil.IsTopScrollView(scrollViewer)) { int index = MenuListBox.SelectedIndex; if (index > 0) { index--; } else { index = MenuListBox.Items.Count - 1; } MenuListBox.SelectedIndex = index; } } //滚动到选中项 MenuListBox.ScrollIntoView(MenuListBox.SelectedItem); } private void Menu_PreviewDragLeave(object sender, DragEventArgs e) { MyPoptip.IsOpen = false; } private void Menu_PreviewDragEnter(object sender, DragEventArgs e) { MenuInfo mi = (sender as ListBoxItem).DataContext as MenuInfo; MyPoptipContent.Text = "移动至:" + mi.MenuName; MyPoptip.VerticalOffset = 30; MyPoptip.IsOpen = true; } private void Menu_MouseLeave(object sender, MouseEventArgs e) { MyPoptip.IsOpen = false; } /// /// 拖动移动图标到指定菜单 /// /// /// private void Menu_Drop(object sender, DragEventArgs e) { MyPoptip.IsOpen = false; MenuInfo mi = (sender as ListBoxItem).DataContext as MenuInfo; IconInfo iconInfo = (IconInfo)e.Data.GetData(typeof(IconInfo)); if (iconInfo != null) { // 将已有图标移动到该菜单 appData.MenuList[MenuListBox.SelectedIndex].IconList.Remove(iconInfo); appData.MenuList[MenuListBox.Items.IndexOf(mi)].IconList.Add(iconInfo); } else { // 直接将新图标移动到该菜单 Array dropObject = (System.Array)e.Data.GetData(DataFormats.FileDrop); if (dropObject == null) return; foreach (object obj in dropObject) { string path = (string)obj; iconInfo = CommonCode.GetIconInfoByPath(path); if (iconInfo == null) { LogUtil.WriteErrorLog("添加项目失败,未能获取到项目图标:" + path); break; } appData.MenuList[MenuListBox.Items.IndexOf(mi)].IconList.Add(iconInfo); } CommonCode.SortIconList(); CommonCode.SaveAppData(MainWindow.appData, Constants.DATA_FILE_PATH); } } private void EncryptMenu(object sender, RoutedEventArgs e) { MenuInfo menuInfo = ((MenuItem)sender).Tag as MenuInfo; if (menuInfo.IsEncrypt) { MainWindow.mainWindow.RightCard.PDDialog.menuInfo = menuInfo; MainWindow.mainWindow.RightCard.PDDialog.Title.Text = "输入密码"; MainWindow.mainWindow.RightCard.PDDialog.type = PasswordType.CANCEL; RunTimeStatus.SHOW_MENU_PASSWORDBOX = true; MainWindow.mainWindow.RightCard.PDDialog.Visibility = Visibility.Visible; //单独设置焦点 MainWindow.mainWindow.RightCard.PDDialog.SetFocus(); } else { if (string.IsNullOrEmpty(appData.AppConfig.MenuPassword)) { MainWindow.mainWindow.RightCard.PDDialog.menuInfo = menuInfo; MainWindow.mainWindow.RightCard.PDDialog.Title.Text = "设置新密码"; MainWindow.mainWindow.RightCard.PDDialog.type = PasswordType.CREATE; RunTimeStatus.SHOW_MENU_PASSWORDBOX = true; MainWindow.mainWindow.RightCard.PDDialog.Visibility = Visibility.Visible; } else { menuInfo.IsEncrypt = true; HandyControl.Controls.Growl.Success(menuInfo.MenuName + " 已加密!", "MainWindowGrowl"); } } } private void AlterPassword(object sender, RoutedEventArgs e) { MainWindow.mainWindow.RightCard.PDDialog.Title.Text = "输入旧密码"; MainWindow.mainWindow.RightCard.PDDialog.type = PasswordType.ALTER; MainWindow.mainWindow.RightCard.PDDialog.Visibility = Visibility.Visible; //单独设置焦点 MainWindow.mainWindow.RightCard.PDDialog.SetFocus(); } /// /// 右键点击进行处理 /// /// /// private void MyCard_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) { RunTimeStatus.SHOW_RIGHT_BTN_MENU = true; new Thread(() => { Thread.Sleep(50); RunTimeStatus.SHOW_RIGHT_BTN_MENU = false; }).Start(); //在没有设置密码的情况下不弹出修改密码菜单 if (string.IsNullOrEmpty(appData.AppConfig.MenuPassword)) { AlterPW1.Visibility = Visibility.Collapsed; } else { AlterPW1.Visibility = Visibility.Visible; } } private void ListBoxItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) { ListBoxItem lbi = sender as ListBoxItem; MenuInfo info = lbi.DataContext as MenuInfo; ItemCollection ics = lbi.ContextMenu.Items; foreach (object obj in ics) { MenuItem mi = (MenuItem)obj; if (mi.Header.Equals("修改密码")) { if (string.IsNullOrEmpty(appData.AppConfig.MenuPassword)) { mi.Visibility = Visibility.Collapsed; } else { mi.Visibility = Visibility.Visible; } break; } if (mi.Header.Equals("加密此列表") || mi.Header.Equals("取消加密此列表")) { if (info.IsEncrypt) { mi.Header = "取消加密此列表"; } else { mi.Header = "加密此列表"; } } } } } }