using BeDesignerSCADA.Common; using BeDesignerSCADA.View; using BeDesignerSCADA.ViewModel; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Forms; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Animation; namespace BeDesignerSCADA.Controls { /// /// CanvasPanelNew.xaml 的交互逻辑 /// public partial class CanvasPanelNew : System.Windows.Controls.UserControl { /// /// 界面Model /// public MainViewModelNew viewModel = new MainViewModelNew(); /// /// 文件夹监视 /// public FileSystemWatcher _watcher; public CanvasPanelNew(string _Path) { InitializeComponent(); EditorHelper.Register(); viewModel.LayoutsPath = _Path; this.DataContext = viewModel; viewModel.Loaded(cav, runCanvas); //控件加载 Assembly assembly = Assembly.LoadFile($"{System.AppDomain.CurrentDomain.BaseDirectory}\\BPASmartClient.SCADAControl.dll"); //Assembly.GetExecutingAssembly(); List types = assembly.GetTypes().Where(t => t.GetInterface("IExecutable") != null)?.ToList(); List typesView = new List(); viewModel.ControlsNameValues.ToList().OrderBy(o => o.Value)?.ToList().ForEach(par => { Type type= types?.Find(p => p.Name == par.Key); if (type != null) typesView.Add(type); }); CtlList.ItemsSource = typesView; //读取文件 CreateDir(); FileRead(_Path); cav.SelectedItemAction += new Action(o => { if (ReditSeleceTab.SelectedIndex!=1) ReditSeleceTab.SelectedIndex = 1; }); } #region 位置调整 /// /// 左对齐 /// /// /// private void AglinLeftBtn_Click(object sender, RoutedEventArgs e) { cav.AlignLeft(); } /// /// 底部对齐 /// /// /// private void AglinBottomBtn_Click(object sender, RoutedEventArgs e) { cav.AlignBottom(); } /// /// 顶部对齐 /// /// /// private void AglinTopBtn_Click(object sender, RoutedEventArgs e) { cav.AlignTop(); } /// /// 右对齐 /// /// /// private void AglinRightBtn_Click(object sender, RoutedEventArgs e) { cav.AlignRight(); } /// /// 居中 /// /// /// private void AglinCenterBtn_Click(object sender, RoutedEventArgs e) { cav.AlignCenter(); } /// /// 垂直分布 /// /// /// private void VerticalLayoutBtn_Click(object sender, RoutedEventArgs e) { cav.VertialLayout(); } /// /// 水平分布 /// /// /// private void HorizontalLayoutBtn_Click(object sender, RoutedEventArgs e) { cav.HorizontalLayout(); } #endregion #region 变量管理器文件夹监听事件 /// /// 创建文件夹,监视文件夹 /// public void CreateDir() { try { //不存在则创建布局文件夹 if (!Directory.Exists($"{System.AppDomain.CurrentDomain.BaseDirectory}Layouts")) { Directory.CreateDirectory($"{System.AppDomain.CurrentDomain.BaseDirectory}Layouts"); } //不存在则创建变量管理器路径 AccessFile if (!Directory.Exists($"{System.AppDomain.CurrentDomain.BaseDirectory}AccessFile")) { Directory.CreateDirectory($"{System.AppDomain.CurrentDomain.BaseDirectory}AccessFile"); } if (!Directory.Exists($"{System.AppDomain.CurrentDomain.BaseDirectory}AccessFile/JSON")) { Directory.CreateDirectory($"{System.AppDomain.CurrentDomain.BaseDirectory}AccessFile/JSON"); } try { this._watcher = new FileSystemWatcher(); _watcher.Path = $"{System.AppDomain.CurrentDomain.BaseDirectory}AccessFile/JSON"; _watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size | NotifyFilters.DirectoryName; _watcher.IncludeSubdirectories = true; _watcher.Created += new FileSystemEventHandler(FileWatcher_Created); _watcher.Changed += new FileSystemEventHandler(FileWatcher_Changed); _watcher.Deleted += new FileSystemEventHandler(FileWatcher_Deleted); _watcher.Renamed += new RenamedEventHandler(FileWatcher_Renamed); Start(); } catch (Exception ex) { Console.WriteLine("Error:" + ex.Message); } } catch (Exception ex) { } } /// /// 监视启动 /// public void Start() { this._watcher.EnableRaisingEvents = true; Console.WriteLine("文件监控已经启动..."); ReadFileVlaue(); } /// /// 监视停止 /// public void Stop() { this._watcher.EnableRaisingEvents = false; this._watcher.Dispose(); this._watcher = null; } /// /// 文件夹新增 /// /// /// protected void FileWatcher_Created(object sender, FileSystemEventArgs e) { Console.WriteLine("新增:" + e.ChangeType + ";" + e.FullPath + ";" + e.Name); ReadFileVlaue(); } /// /// 文件名变更-文件大小变化 /// /// /// protected void FileWatcher_Changed(object sender, FileSystemEventArgs e) { Console.WriteLine("变更:" + e.ChangeType + ";" + e.FullPath + ";" + e.Name); ReadFileVlaue(); } /// /// 删除 /// /// /// protected void FileWatcher_Deleted(object sender, FileSystemEventArgs e) { Console.WriteLine("删除:" + e.ChangeType + ";" + e.FullPath + ";" + e.Name); ReadFileVlaue(); } /// /// 文件名 /// /// /// protected void FileWatcher_Renamed(object sender, RenamedEventArgs e) { Console.WriteLine("重命名: OldPath:{0} NewPath:{1} OldFileName{2} NewFileName:{3}", e.OldFullPath, e.FullPath, e.OldName, e.Name); ReadFileVlaue(); } /// /// 读取文件变量 /// public void ReadFileVlaue() { try { Directory.CreateDirectory(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "AccessFile\\JSON")); viewModel.VariablePath = AppDomain.CurrentDomain.BaseDirectory + "AccessFile\\JSON\\CommunicationPar.json"; DataBusModel.GetInstance().RefreshVariableManager(viewModel.VariablePath); } catch (Exception ex) { } } #endregion #region 外部调用事件 /// /// 传入变量管理器地址 /// /// public void VariableManagerPath(string path) { try { viewModel.VariablePath = path; } catch (Exception ex) { } } /// /// 保存文件流 布局文件 /// public void FileSave() { viewModel.SaveAllPageHeaderPath(viewModel.LayoutsPath); } /// /// 读取文件,加载布局 /// /// public void FileRead(string path) { try { if (File.Exists(path)) { viewModel.LoadAllPageHeaderPath(path); } } catch (Exception ex) { } } /// /// 运行程序 /// public void Run() { try { cav.ClearSelection(); runCanvas.Run(cav.Generator()); } catch (Exception ex) { } } /// /// 停止运行程序 /// public void Destory() { try { runCanvas.Destory(); } catch (Exception ex) { throw; } } #endregion #region 执行操作事件 /// /// 查询输入框 /// /// /// private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { try { System.Windows.Controls.TextBox textBox = sender as System.Windows.Controls.TextBox; var info = viewModel.ControlsNameValues?.ToList().Find(par => par.Value.ToLower().StartsWith(textBox.Text.ToLower())); if (info.Value.Key != null) { foreach (var item in CtlList.Items) { if ((item as Type).Name== info.Value.Key) { CtlList.ScrollIntoView(item); CtlList.SelectedItem = item; } } } } catch (Exception ex) { } } /// /// 运行 /// /// /// private void RunBtn_Click(object sender, RoutedEventArgs e) { if (sender is System.Windows.Controls.Button btn) { if (btn.Tag.ToString() == "运行") { cav.ClearSelection(); runCanvas.Run(cav.Generator()); } else if (btn.Tag.ToString() == "停止") { runCanvas.Destory(); } } } /// /// 模拟运行 /// /// /// RunWindows runWindows = null; private void MNRunBtn_Click(object sender, RoutedEventArgs e) { cav.ClearSelection(); if (runWindows != null) { runWindows.Close(); runWindows = null; } runWindows = new RunWindows(); runWindows.LoadingData(JsonConvert.DeserializeObject(JsonConvert.SerializeObject(viewModel.MenuModel))); runWindows.Show(); } /// /// 加载 /// /// /// private void LoadBtn_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "布局文件|*.lay"; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { cav.Load(ofd.FileName); } } /// /// 保存 /// /// /// private void SaveBtn_Click(object sender, RoutedEventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "布局文件|*.lay"; if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { string str = cav.Save(); File.WriteAllText(sfd.FileName, str, Encoding.Unicode); } } /// /// 保存页面 /// /// /// private void SavePage_Click(object sender, RoutedEventArgs e) { try { LeftSelectTab.SelectedIndex = 0; if (viewModel.MenuModel.SelectPageModels == null) viewModel.MenuModel.SelectPageModels = viewModel.MenuModel.pageModels[0]; viewModel.MenuModel.SelectPageModels.visual?.Children.Clear(); foreach (FrameworkElement element in cav.Children) { string xamlText = XamlWriter.Save(element); FrameworkElement item = XamlReader.Parse(xamlText) as FrameworkElement; viewModel.MenuModel.SelectPageModels.visual.Children.Add(item); } viewModel.UpdatePageBase(viewModel.MenuModel.SelectPageModels); } catch (Exception ex) { } } /// /// 选中Tab改变事件 /// /// /// private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { try { if (LeftSelectTab.SelectedIndex <= 1 && ReditSeleceTab != null) { ReditSeleceTab.SelectedIndex = LeftSelectTab.SelectedIndex; } } catch (Exception ex) { } } /// /// 页选中改变事件 /// /// /// private void PageList_SelectionChanged(object sender, SelectionChangedEventArgs e) { ReditSeleceTab.SelectedIndex = 0; } #endregion #region 左侧控件栏移动 /// /// 移动到右侧 /// /// /// private void CtlList_PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e) { if (CtlList.SelectedItem != null && e.LeftButton == MouseButtonState.Pressed) { DragDrop.DoDragDrop(CtlList, CtlList.SelectedItem, System.Windows.DragDropEffects.Copy); codeEditor.Text = cav.Save(); } } /// /// 显示代码 /// /// /// private void showCode_Click(object sender, RoutedEventArgs e) { codeEditor.Text = cav.Save(); } /// /// 编辑 /// /// /// private void ToggleButton_Click(object sender, RoutedEventArgs e) { try { if (sender is ToggleButton) { ToggleButton toggle = (ToggleButton)sender; Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyGridCommand = toggle.DataContext as Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem; if (propertyGridCommand != null) { viewModel.Edit(propertyGridCommand); } } } catch (Exception ex) { } } /// /// 路径资源选择 /// /// /// private void LJToggleButton_Click(object sender, RoutedEventArgs e) { try { if (sender is ToggleButton) { ToggleButton toggle = (ToggleButton)sender; Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyGridCommand = toggle.DataContext as Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem; if (propertyGridCommand != null) { viewModel.SelectPath(propertyGridCommand); } } } catch (Exception ex) { } } /// /// 选择进程 /// /// /// private void XZToggleButton_Click(object sender, RoutedEventArgs e) { try { if (sender is ToggleButton) { ToggleButton toggle = (ToggleButton)sender; Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyGridCommand = toggle.DataContext as Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem; if (propertyGridCommand != null) { viewModel.SelectValuePath(propertyGridCommand); } } } catch (Exception ex) { } } /// /// 设置子控件模板 /// /// /// private void ChildToggleButton_Click(object sender, RoutedEventArgs e) { try { if (sender is ToggleButton) { ToggleButton toggle = (ToggleButton)sender; Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyGridCommand = toggle.DataContext as Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem; if (propertyGridCommand != null) { viewModel.ChildEdit(propertyGridCommand); } } } catch (Exception ex) { } } /// /// 数据绑定 /// /// /// private void BingToggleButton_Click(object sender, RoutedEventArgs e) { try { if (sender is ToggleButton) { ToggleButton toggle = (ToggleButton)sender; Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyGridCommand = toggle.DataContext as Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem; if (propertyGridCommand != null) { viewModel.BingEdit(propertyGridCommand); } } } catch (Exception ex) { } } /// /// 清除绑定 /// /// /// private void ClearBingToggleButton_Click(object sender, RoutedEventArgs e) { try { if (sender is ToggleButton) { ToggleButton toggle = (ToggleButton)sender; Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyGridCommand = toggle.DataContext as Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem; if (propertyGridCommand != null) { viewModel.ClearBingEdit(propertyGridCommand); } } } catch (Exception ex) { } } #endregion } }