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
}
}