// 打开项目 private void menuOpenOpenProject_Click(object sender, RoutedEventArgs e) { CommonOpenFileDialog cofd = new CommonOpenFileDialog(); cofd.IsFolderPicker = true; if (cofd.ShowDialog() == CommonFileDialogResult.Ok) { new Task(() => { this.BeginInvoke(new Action(() => { projectRootPath = cofd.FileName; fileTree.Items.Clear(); listItems.Clear(); editorManager.Clear(); TreeViewItem parentNode = SetTreeViewItem("Resources/Images/OpenFolder.png", Path.GetFileNameWithoutExtension(cofd.FileName), Path.GetFileName(projectRootPath)); TVItems items = new TVItems() { ViewItem = parentNode, path = projectRootPath, isFolder = true }; listItems.Add(items); LoadFileDirectory(projectRootPath, parentNode); parentNode.IsExpanded = true;//子项展开 fileTree.Items.Add(parentNode); })); }).Start(); } }
//文本更改 private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { TextBox textBox = sender as TextBox; TextBlock textBlock = ((sender as TextBox).Parent as StackPanel).Children[1] as TextBlock; TreeViewItem tempTreeViewItem = ((sender as TextBox).Parent as StackPanel).Parent as TreeViewItem; TVItems tVItems = listItems.Find(delegate(TVItems tv) { return(tv.ViewItem.Equals(tempTreeViewItem)); }); TVItems tVItems1 = listItems.Find(delegate(TVItems tv) { return(tv.path.Equals(Path.GetDirectoryName(tVItems.path) + "\\" + textBox.Text)); }); if (tVItems1 != null && tVItems1 != tVItems) { StackPanel stackPanel = new StackPanel(); TextBlock textBlock1 = new TextBlock(); textBlock1.Foreground = Brushes.Red; textBlock1.Text = "该文件或文件夹已存在!"; stackPanel.Children.Add(textBlock1); textBox.ToolTip = stackPanel; } else if (textBox.Text.IndexOfAny(Path.GetInvalidFileNameChars()) != -1) { StackPanel stackPanel = new StackPanel(); TextBlock textBlock1 = new TextBlock(); textBlock1.Foreground = Brushes.Red; textBlock1.Text = "文件名无效!"; stackPanel.Children.Add(textBlock1); textBox.ToolTip = stackPanel; } else { textBox.ToolTip = null; } }
//鼠标右键单击文件树 private void fileTree_MouseRightButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { var treeViewItem = VisualUpwardSearch <TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem; if (treeViewItem != null) { treeViewItem.Focus(); e.Handled = true; } TVItems tVItems = listItems.Find(delegate(TVItems tv) { return(tv.ViewItem.Equals(treeViewItem)); }); if (tVItems == null) { return; } if (tVItems.isFolder) { FileTreeContextMenu(treeViewItem, tVItems); } else { FileTreeContextMenu(treeViewItem, tVItems, false); } }
//复制 private void CMCopy_Click(TreeViewItem tvi, TVItems itm) { List <string> strs = new List <string> { itm.path }; Util.CopyToClipboard(strs.ToArray(), false); }
//文件树被更改 private void FileTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e) { TreeViewItem item = (TreeViewItem)e.NewValue; // 获取到选中的TreeViewItem对象 TVItems tVItems = listItems.Find(delegate(TVItems tv) { return(tv.ViewItem.Equals(item)); }); if (tVItems == null) { return; } if (!tVItems.isFolder && File.Exists(tVItems.path)) { // 后缀名匹配则解析,否则直接载入 if (Util.IsExtensionName(Path.GetExtension(tVItems.path)) && Path.GetExtension(tVItems.path) == Util.extension) { // 加载模组文件 modClassTree.Items.Clear(); modClass = new YAMLForm(tVItems.path, this, editorManager); editorManager.Clear(); editorManager.LoadDataFromFile(tVItems.path); } else if (Util.IsExtensionName(Path.GetExtension(tVItems.path)) && Path.GetExtension(tVItems.path) == ".txt") { //解析代码并格式化为YAML,加载 modClassTree.Items.Clear(); new CodeForm(tVItems.path, this, editorManager); } else { editorManager.LoadDataFromFile(tVItems.path); } /*try * { * // 后缀名匹配则解析,否则直接载入 * if (Util.IsExtensionName(Path.GetExtension(tVItems.path)) && Path.GetExtension(tVItems.path) == ".txt") * { * //解析代码并格式化为YAML,加载 * modClassTree.Items.Clear(); * new CodeForm(tVItems.path, this, editorManager); * } * else * { * editorManager.LoadDataFromFile(tVItems.path); * } * } * catch (Exception ex) * { * //解析错误,直接载入 * editorManager.LoadDataFromFile(tVItems.path); * OperationInterface.SetStatusText(ex.Message, OperationInterface.StatusText.Warning); * }*/ } }
/// <summary> /// 遍历文件夹和文件夹并删除 /// </summary> /// <param name="path"></param> private void DeleteFileAndDirectory(string path) { DirectoryInfo theFolder = new DirectoryInfo(@path); //遍历文件 foreach (FileInfo NextFile in theFolder.GetFiles()) { File.Delete(NextFile.FullName); TVItems tVItems = listItems.Find(delegate(TVItems tv) { return(tv.path.Equals(NextFile.FullName)); }); if (tVItems != null) { listItems.Remove(tVItems); } } //遍历文件夹 foreach (DirectoryInfo NextFolder in theFolder.GetDirectories()) { DeleteFileAndDirectory(NextFolder.FullName); //Directory.Delete(NextFolder.FullName); TVItems tVItems = listItems.Find(delegate(TVItems tv) { return(tv.path.Equals(NextFolder.FullName)); }); if (tVItems != null) { listItems.Remove(tVItems); } } Directory.Delete(theFolder.FullName); TVItems tVItemsd = listItems.Find(delegate(TVItems tv) { return(tv.path.Equals(theFolder.FullName)); }); if (tVItemsd != null) { listItems.Remove(tVItemsd); } if (editorManager.currentPath == theFolder.FullName) { editorManager.Clear(); } }
//新建文件夹 private void CMNewFolder_Click(TreeViewItem tvi, TVItems itm) { if (itm.isFolder) { TreeViewItem tempchildNode = SetTreeViewItem("Resources/Images/OpenFolder.png", "", ""); TVItems itemFolder = new TVItems() { ViewItem = tempchildNode, path = itm.path + "\\", isFolder = true }; listItems.Add(itemFolder); tvi.Items.Insert(0, tempchildNode); tvi.IsExpanded = true; new ContextMenu().IsOpen = true; CMRename_Click(tempchildNode, itemFolder); } }
/// <summary> /// 加载文件目录树 /// </summary> /// <param name="path"></param> /// <param name="tvi"></param> //TreeViewItem tvi private void LoadFileDirectory(string path, TreeViewItem parentNode) { DirectoryInfo theFolder = new DirectoryInfo(@path); //遍历文件夹 foreach (DirectoryInfo NextFolder in theFolder.GetDirectories()) { TreeViewItem childNode = SetTreeViewItem("Resources/Images/OpenFolder.png", LocalizedLangExtension.GetString(NextFolder.Name), NextFolder.Name); TVItems itemDir = new TVItems() { ViewItem = childNode, path = path + "\\" + NextFolder.Name, isFolder = true }; listItems.Add(itemDir); parentNode.Items.Add(childNode); LoadFileDirectory(NextFolder.FullName, childNode); } //遍历文件 foreach (FileInfo NextFile in theFolder.GetFiles()) { TreeViewItem childNode; if (NextFile.Extension == Util.extension) { childNode = SetTreeViewItem("Resources/Images/CodeFile.png", NextFile.Name, NextFile.Name); } else { childNode = SetTreeViewItem("Resources/Images/DefaultFile.png", NextFile.Name, NextFile.Name); } TVItems itemFile = new TVItems() { ViewItem = childNode, path = path + "\\" + NextFile.Name, isFolder = false }; listItems.Add(itemFile); parentNode.Items.Add(childNode); } }
//重命名 private void CMRename_Click(TreeViewItem tvi, TVItems itm) { StackPanel stackPanel = tvi.Header as StackPanel; TextBlock textBlock = stackPanel.Children[1] as TextBlock; TextBox textBox = stackPanel.Children[2] as TextBox; textBox.KeyDown += TextBox_KeyDown; tvi.Focus(); if (textBlock.Visibility == Visibility.Visible) { textBlock.Visibility = Visibility.Collapsed; textBox.Visibility = Visibility.Visible; textBox.Focus(); textBox.SelectAll(); } else { textBlock.Visibility = Visibility.Visible; textBox.Visibility = Visibility.Collapsed; } }
//删除 private void CMDelete_Click(TreeViewItem tvi, TVItems itm) { if (itm.isFolder) { DeleteFileAndDirectory(itm.path); DeleteFileTree(tvi); } else { File.Delete(itm.path); TVItems tVItemsd = listItems.Find(delegate(TVItems tv) { return(tv.path.Equals(itm.path)); }); if (tVItemsd != null) { listItems.Remove(tVItemsd); } if (editorManager.currentPath == itm.path) { editorManager.Clear(); } DeleteFileTree(tvi); } }
//失去焦点 private void TextBox_LostFocus(object sender, RoutedEventArgs e) { TextBox textBox = sender as TextBox; Image image = ((sender as TextBox).Parent as StackPanel).Children[0] as Image; TextBlock textBlock = ((sender as TextBox).Parent as StackPanel).Children[1] as TextBlock; TreeViewItem tempTreeViewItem = ((sender as TextBox).Parent as StackPanel).Parent as TreeViewItem; TVItems tVItems = listItems.Find(delegate(TVItems tv) { return(tv.ViewItem.Equals(tempTreeViewItem)); }); //文件或文件夹是否存在 bool isFF = !string.IsNullOrWhiteSpace(Path.GetFileName(tVItems.path)); //新建 if (!isFF) { TVItems tVItems1 = listItems.Find(delegate(TVItems tv) { return(tv.path.Equals(Path.GetDirectoryName(tVItems.path) + "\\" + textBox.Text)); }); //当前节点是空白,则删除 || 重复文件名 || 文件名无效 if (string.IsNullOrWhiteSpace(textBox.Text) || tVItems1 != null || textBox.Text.IndexOfAny(Path.GetInvalidFileNameChars()) != -1) { (tempTreeViewItem.Parent as TreeViewItem).Items.Remove(tempTreeViewItem); listItems.Remove(tVItems); } else { if (!tVItems.isFolder) { string str = textBox.Text.Replace(Util.extension, ""); textBox.Text = str + ".me"; } tVItems.path = Path.GetDirectoryName(tVItems.path) + "\\" + textBox.Text; textBox.Text = Path.GetFileName(tVItems.path); if (tVItems.isFolder) { Directory.CreateDirectory(Path.GetDirectoryName(tVItems.path) + "\\" + textBox.Text); textBlock.Text = LocalizedLangExtension.GetString(Path.GetFileNameWithoutExtension(tVItems.path)); } else { FileStream fs = new FileStream(Path.GetDirectoryName(tVItems.path) + "\\" + textBox.Text, FileMode.Create); StreamWriter sw = new StreamWriter(fs, new UTF8Encoding(false)); var serializer = new SerializerBuilder().Build(); var yaml = serializer.Serialize(new List <ModClass>()); sw.Write(yaml); sw.Close(); fs.Close(); textBlock.Text = Path.GetFileName(tVItems.path); //后缀 if (Path.GetExtension(tVItems.path) == ".me") { image.Source = new BitmapImage(new Uri("pack://application:,,,/" + "Resources/Images/CodeFile.png")); } } //选中更改 tempTreeViewItem.IsSelected = false; tempTreeViewItem.IsSelected = true; } } else { //重命名 if (textBox.Text != Path.GetFileName(tVItems.path) && !(textBox.Text.IndexOfAny(Path.GetInvalidFileNameChars()) != -1) && !string.IsNullOrWhiteSpace(textBox.Text)) { try { //上级目录 string pd = Path.GetDirectoryName(tVItems.path) + "\\"; //要修改的路径 string md = tVItems.path; // Computer computer = new Computer(); if (tVItems.isFolder) { computer.FileSystem.RenameDirectory(tVItems.path, textBox.Text); } else { string str = textBox.Text.Replace(Util.extension, ""); textBox.Text = str + ".me"; computer.FileSystem.RenameFile(tVItems.path, textBox.Text); } //遍历相同的路径并更改 foreach (TVItems itm in listItems) { itm.path = itm.path.Replace(md, pd + textBox.Text); } tVItems.path = pd + textBox.Text; if (tVItems.isFolder) { textBlock.Text = LocalizedLangExtension.GetString(Path.GetFileNameWithoutExtension(tVItems.path)); } else { textBlock.Text = Path.GetFileName(tVItems.path); //后缀 if (Path.GetExtension(tVItems.path) == ".me") { image.Source = new BitmapImage(new Uri("pack://application:,,,/" + "Resources/Images/CodeFile.png")); } } textBox.Text = Path.GetFileName(tVItems.path); string tmd = md.Replace("\\", "\\\\"); //是否匹配已打开的文件,匹配则重载 if (Regex.IsMatch(editorManager.currentPath, @tmd)) { //选中更改 tempTreeViewItem.IsSelected = false; tempTreeViewItem.IsSelected = true; } } catch (Exception) { textBox.Text = Path.GetFileName(tVItems.path); } } else { textBox.Text = Path.GetFileName(tVItems.path); } } textBox.Visibility = Visibility.Collapsed; textBlock.Visibility = Visibility.Visible; }
//文件树上下文菜单 void FileTreeContextMenu(TreeViewItem treeViewItem, TVItems tVItems, bool isFolder = true) { ContextMenu contextMenu = new ContextMenu(); CompositeCollection contextMenuBase = new CompositeCollection(); CompositeCollection compositeCollection = new CompositeCollection(); CollectionContainer collectionContainer = new CollectionContainer(); MenuItem cmCut = new MenuItem(); cmCut.Header = LocalizedLangExtension.GetString("Cut"); cmCut.Click += (misender, mie) => CMCut_Click(treeViewItem, tVItems); MenuItem cmCopy = new MenuItem(); cmCopy.Header = LocalizedLangExtension.GetString("Copy"); cmCopy.Click += (misender, mie) => CMCopy_Click(treeViewItem, tVItems); MenuItem cmPaste = new MenuItem(); cmPaste.Header = LocalizedLangExtension.GetString("Paste"); //cmPaste.Click += (misender, mie) => CMRename_Click(treeViewItem, tVItems); MenuItem cmRename = new MenuItem(); cmRename.Header = LocalizedLangExtension.GetString("Rename"); cmRename.Click += (misender, mie) => CMRename_Click(treeViewItem, tVItems); MenuItem cmDelete = new MenuItem(); cmDelete.Header = LocalizedLangExtension.GetString("Delete"); cmDelete.Click += (misender, mie) => CMDelete_Click(treeViewItem, tVItems); MenuItem cmNewFolder = new MenuItem(); cmNewFolder.Header = LocalizedLangExtension.GetString("NewFolder"); cmNewFolder.Click += (misender, mie) => CMNewFolder_Click(treeViewItem, tVItems); MenuItem cmNewFile = new MenuItem(); cmNewFile.Header = LocalizedLangExtension.GetString("NewFile"); cmNewFile.Click += (misender, mie) => CMNewFile_Click(treeViewItem, tVItems); cmCut.IsEnabled = false; cmPaste.IsEnabled = false; cmNewFolder.IsEnabled = false; cmNewFile.IsEnabled = false; if (isFolder) { if (Clipboard.GetDataObject() == null) { cmPaste.IsEnabled = false; } else { //cmPaste.IsEnabled = true; } cmNewFolder.IsEnabled = true; cmNewFile.IsEnabled = true; } contextMenuBase.Add(cmCut); contextMenuBase.Add(cmCopy); contextMenuBase.Add(cmPaste); contextMenuBase.Add(cmDelete); contextMenuBase.Add(new Separator()); contextMenuBase.Add(cmRename); contextMenuBase.Add(new Separator()); contextMenuBase.Add(cmNewFolder); contextMenuBase.Add(cmNewFile); collectionContainer.Collection = contextMenuBase; compositeCollection.Add(collectionContainer); contextMenu.ItemsSource = compositeCollection; contextMenu.IsOpen = true; }