// 打开项目
        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;
        }