Browse Source

增加数据绑定模块 增加列表集合bing模块

master
fyf 2 years ago
parent
commit
840d3b130c
8 changed files with 617 additions and 63 deletions
  1. +1
    -6
      BPASmartClient.SCADAControl/CustomerControls/TheDataGrid.xaml.cs
  2. +286
    -25
      BPASmartClient.SCADAControl/CustomerControls/TheListBox.xaml.cs
  3. +24
    -2
      BeDesignerSCADA/Controls/MainCanvasPanel.xaml
  4. +128
    -1
      BeDesignerSCADA/Controls/MainCanvasPanel.xaml.cs
  5. +38
    -0
      BeDesignerSCADA/View/ChildEditWindow.xaml
  6. +111
    -0
      BeDesignerSCADA/View/ChildEditWindow.xaml.cs
  7. +1
    -2
      BeDesignerSCADA/View/JsEditWindow.xaml
  8. +28
    -27
      BeDesignerSCADA/ViewModel/MainViewModelNew.cs

+ 1
- 6
BPASmartClient.SCADAControl/CustomerControls/TheDataGrid.xaml.cs View File

@@ -33,11 +33,6 @@ namespace BPASmartClient.SCADAControl.CustomerControls
public TheDataGrid()
{
InitializeComponent();
//ResourceDictionary languageResDic = new ResourceDictionary();
//languageResDic.Source = new Uri(@"/BPASmartClient.SCADAControl;component/Themes/Generic.xaml", UriKind.RelativeOrAbsolute);
//this.Resources.MergedDictionaries.Add(languageResDic);
//MinWidth = 100;
//MinHeight = 100;
Width = 100;
Height = 100;
this.Loaded += TheDataGrid_Loaded; ;
@@ -185,7 +180,7 @@ namespace BPASmartClient.SCADAControl.CustomerControls
set { SetValue(TimeCountProperty,value); }
}
public static readonly DependencyProperty TimeCountProperty =
DependencyProperty.Register("TimeCount",typeof(int),typeof(TheDataGrid),new PropertyMetadata(5));
DependencyProperty.Register("TimeCount",typeof(int),typeof(TheDataGrid),new PropertyMetadata(500));
[Category("数据绑定-数据来源")]
public string DataSouceInformation
{


+ 286
- 25
BPASmartClient.SCADAControl/CustomerControls/TheListBox.xaml.cs View File

@@ -1,6 +1,9 @@
using BPASmartClient.Compiler;
using BPASmartClient.DATABUS;
using BPASmartClient.MessageName.EnumHelp;
using BPASmartClient.MessageName.接收消息Model.物料仓;
using BPASmartClient.SCADAControl.Converters;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
@@ -13,17 +16,20 @@ using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using System.Xml;

namespace BPASmartClient.SCADAControl.CustomerControls
{
/// <summary>
/// TheListBox.xaml 的交互逻辑
/// </summary>
public partial class TheListBox :ListBox, IExecutable
public partial class TheListBox :ListBox, IExecutable, IDisposable
{
public event EventHandler PropertyChange; //声明一个事件

@@ -33,34 +39,155 @@ namespace BPASmartClient.SCADAControl.CustomerControls
ResourceDictionary languageResDic = new ResourceDictionary();
languageResDic.Source = new Uri(@"/BPASmartClient.SCADAControl;component/Themes/Generic.xaml",UriKind.RelativeOrAbsolute);
this.Resources.MergedDictionaries.Add(languageResDic);
//Style = Application.Current.Resources["DesignTheListBox"] as Style;
MinWidth = 100;
MinHeight = 100;
//ItemsString = new ItemsListObj()
//{
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
// new datalist { Name="23232",Description="wwewewew",Messgae="564654645"},
//};
EditorHelper.Register<BindingExpression, BindingConvertor>();
Width = 100;
Height = 100;
}

public ItemsListObj ItemsString
#region 属性
[Category("控件数据集合")]
private ObservableCollection<object> ItemsString
{
get { return (ItemsListObj)GetValue(ItemsStringProperty); }
set { SetValue(ItemsStringProperty,value); }
get { return (ObservableCollection<object>)GetValue(ItemsStringProperty); }
set { SetValue(ItemsStringProperty, value); }
}
private static readonly DependencyProperty ItemsStringProperty =
DependencyProperty.Register("ItemsString", typeof(ObservableCollection<object>), typeof(TheListBox), new PropertyMetadata(new ObservableCollection<object>()));

public static readonly DependencyProperty ItemsStringProperty =
DependencyProperty.Register("ItemsString",typeof(ItemsListObj),typeof(TheListBox),new PropertyMetadata(null));
[Category("子控件模板XML格式")]
public string ChildTemplateXml
{
get { return (string)GetValue(ChildTemplateXmlProperty); }
set { SetValue(ChildTemplateXmlProperty, value); }
}
public static readonly DependencyProperty ChildTemplateXmlProperty =
DependencyProperty.Register("ChildTemplateXml", typeof(string), typeof(TheListBox), new PropertyMetadata(string.Empty,new PropertyChangedCallback(onChildTemplateXmlChanged)));
private static void onChildTemplateXmlChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as TheListBox)?.XmlRefresh();
public void XmlRefresh()
{
;
}


[Category("数据绑定-数据来源")]
public DataTypeEnum DataSouceType
{
get { return (DataTypeEnum)GetValue(DataSouceTypeProperty); }
set { SetValue(DataSouceTypeProperty, value); }
}
public static readonly DependencyProperty DataSouceTypeProperty =
DependencyProperty.Register("DataSouceType", typeof(DataTypeEnum), typeof(TheListBox), new PropertyMetadata(DataTypeEnum.API接口));
[Category("数据绑定-数据来源")]
public int TimeCount
{
get { return (int)GetValue(TimeCountProperty); }
set { SetValue(TimeCountProperty, value); }
}
public static readonly DependencyProperty TimeCountProperty =
DependencyProperty.Register("TimeCount", typeof(int), typeof(TheListBox), new PropertyMetadata(500));
[Category("数据绑定-数据来源")]
public string DataSouceInformation
{
get { return (string)GetValue(DataSouceInformationProperty); }
set { SetValue(DataSouceInformationProperty, value); }
}
public static readonly DependencyProperty DataSouceInformationProperty =
DependencyProperty.Register("DataSouceInformation", typeof(string), typeof(TheListBox), new PropertyMetadata("api0"));
[Category("数据绑定")]
public string FDataSouce
{
get { return (string)GetValue(FDataSouceProperty); }
set { SetValue(FDataSouceProperty, value); }
}
public static readonly DependencyProperty FDataSouceProperty =
DependencyProperty.Register("FDataSouce", typeof(string), typeof(TheListBox), new PropertyMetadata(string.Empty, new PropertyChangedCallback(onFDataSouceChanged)));
private static void onFDataSouceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as TheListBox)?.DataSouceRefresh();
public void DataSouceRefresh()
{
try
{
GenerateData = (string)CSharpConfig.GetInstance().RunCSharp(Code, new object[] { FDataSouce });
if (PropertyChange != null)
{
PropertyChange(this, null);
}
}
catch (Exception ex)
{

}
}
public static string _code = "public string main(string message) \n{ \n //请在此填写你的代码\n\n return message; \n}\n";
[Category("数据绑定")]
public string Code
{
get { return (string)GetValue(CodeProperty); }
set { SetValue(CodeProperty, value); }
}
public static readonly DependencyProperty CodeProperty =
DependencyProperty.Register("Code", typeof(string), typeof(TheListBox), new PropertyMetadata(_code));
//[Category("数据绑定")]
//public bool IsRun
//{
// get { return (bool)GetValue(RunProperty); }
// set { SetValue(RunProperty, value); }
//}
//public static readonly DependencyProperty RunProperty =
// DependencyProperty.Register("IsRun", typeof(bool), typeof(TheListBox), new PropertyMetadata(false, new PropertyChangedCallback(onIsRunChanged)));
//private static void onIsRunChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as TheListBox)?.IsRunRefresh();
public void IsRunRefresh()
{
////测试运行
//if (IsRun)
// IsExecuteState = true;
//else
//{
// IsExecuteState = false;
// Dispose();
//}
}
[Category("数据绑定")]
public string GenerateData
{
get { return (string)GetValue(GenerateDataProperty); }
set { SetValue(GenerateDataProperty, value); }
}
public static readonly DependencyProperty GenerateDataProperty =
DependencyProperty.Register("GenerateData", typeof(string), typeof(TheListBox), new PropertyMetadata(string.Empty, new PropertyChangedCallback(onGenerateDataChanged)));
private static void onGenerateDataChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as TheListBox)?.GenerateDataRefresh();
public void GenerateDataRefresh()
{
if (!string.IsNullOrEmpty(GenerateData) && GenerateData.Contains("data"))
{
try
{
Dictionary<string, object> keys = JsonConvert.DeserializeObject<Dictionary<string, object>>(GenerateData);
ItemsString = JsonConvert.DeserializeObject<ObservableCollection<object>>(keys["data"].ToString());


//ItemsString = JsonConvert.DeserializeObject<DataSouceModel>(GenerateData);
// 运行时进行项目绑定

//this.ItemsSource = ListToDataTable(obj2).DefaultView;

// 运行时进行项目绑定
//Binding binding = new Binding();
//binding.RelativeSource = new RelativeSource() { Mode = RelativeSourceMode.Self };
//binding.Path = new PropertyPath("ItemsString");
//SetBinding(ItemsSourceProperty,binding);
}
catch (Exception ex)
{

}
}
else
{
//this.Items.Clear();
}

}
#endregion

public string ControlType => "控件";

@@ -73,28 +200,162 @@ namespace BPASmartClient.SCADAControl.CustomerControls
isExecuteState = value;
if (IsExecuteState)
{
//Style = null;
Register();
}
}
}

DispatcherTimer timer = new DispatcherTimer();
/// <summary>
/// 注册需要处理的事件
/// </summary>
public void Register()
{
// 运行时进行项目绑定
XmlToFrameworkElement();

if (DataSouceType == DataTypeEnum.API接口)
{
timer.Interval = TimeSpan.FromMilliseconds(TimeCount);
timer.Tick += Timer_Tick; ;
timer.Start();
}
}

/// <summary>
/// 流转Xml
/// </summary>
/// <param name="framework"></param>
public void FrameworkElementToXml(FrameworkElement framework)
{
StringBuilder outstr = new StringBuilder();
try
{
//this code need for right XML fomating
XmlWriterSettings settings = new XmlWriterSettings
{
Indent = true,
OmitXmlDeclaration = true
};
var dsm = new XamlDesignerSerializationManager(XmlWriter.Create(outstr, settings))
{
//this string need for turning on expression saving mode
XamlWriterMode = XamlWriterMode.Expression
};

XamlWriter.Save(framework, dsm);
}
catch (Exception ex) { }
ChildTemplateXml = outstr.ToString();
}

public void XmlToFrameworkElement()
{
StackPanel stackPanel = new StackPanel() { Width = 600, Height = 30, Orientation = Orientation.Horizontal };
Button button = new Button();
button.Name = "button1";
Binding bindingButton = new Binding("alarmTime");
button.SetBinding(Button.ContentProperty, bindingButton);
stackPanel.Children.Add(button);

TextBlock textBlock = new TextBlock();
textBlock.Name = "text1";
Binding bindingtextBlock = new Binding("alarmMessage");
textBlock.SetBinding(TextBlock.TextProperty, bindingtextBlock);
stackPanel.Children.Add(textBlock);
FrameworkElementToXml(stackPanel);



var template = (DataTemplate)XamlReader.Parse(@"
<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"">
" + ChildTemplateXml + @"
</DataTemplate>");
SetValue(ItemTemplateProperty, template);

Binding binding = new Binding();
binding.RelativeSource = new RelativeSource() { Mode = RelativeSourceMode.Self };
binding.Path = new PropertyPath("ItemsString");
SetBinding(ItemsSourceProperty, binding);
}

SetBinding(ItemsSourceProperty,binding);
public void Dispose()
{
timer.Stop();
FDataSouce = "";
//if (IsRun) IsRun = false;
GenerateDataRefresh();
}

private void MyButton_Click(object sender,RoutedEventArgs e)
private void Timer_Tick(object? sender, EventArgs e)
{
if (!string.IsNullOrEmpty(DataSouceInformation))
{
if (DataSouceType == DataTypeEnum.API接口)
{
if (Class_DataBus.GetInstance().Dic_APIData.ContainsKey(DataSouceInformation))
{
FDataSouce = Class_DataBus.GetInstance().Dic_APIData[DataSouceInformation];
}
}
else if (DataSouceType == DataTypeEnum.Redis)
{
if (DataSouceInformation.Contains(".") && DataSouceInformation.Contains("{Binding "))
{
string[] str = DataSouceInformation.Replace("{Binding ", "").Replace("}", "").Split(".");
if (str.Length > 1)
{
if (Class_DataBus.GetInstance().Dic_DeviceData.ContainsKey(str[0]))
{
Dictionary<string, DeviceDataModel> b = Class_DataBus.GetInstance().Dic_DeviceData[str[0]];
if (b != null && b.ContainsKey(str[1]))
{
FDataSouce = b[str[1]].VarVaule;
}
}
}
}
}
else if (DataSouceType == DataTypeEnum.静态数据)
{
FDataSouce = "";
}
}
}

}

internal class BindingConvertor : ExpressionConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(MarkupExtension))
return true;
else return false;
}
public override object ConvertTo(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(MarkupExtension))
{
BindingExpression bindingExpression = value as BindingExpression;
if (bindingExpression == null)
throw new Exception();
return bindingExpression.ParentBinding;
}

return base.ConvertTo(context, culture, value, destinationType);
}
}

internal static class EditorHelper
{
public static void Register<T, TC>()
{
Attribute[] attr = new Attribute[1];
TypeConverterAttribute vConv = new TypeConverterAttribute(typeof(TC));
attr[0] = vConv;
TypeDescriptor.AddAttributes(typeof(T), attr);
}
}
}

+ 24
- 2
BeDesignerSCADA/Controls/MainCanvasPanel.xaml View File

@@ -269,6 +269,9 @@

<mypro:PropertyDefinition DisplayName="列表项" Category="集合设置" Name="ItemsString" />
<mypro:PropertyDefinition DisplayName="列表项" Category="集合设置" Name="TabItems" />
<mypro:PropertyDefinition DisplayName="子控件模板" Category="集合设置" Name="ChildTemplateXml" />


<mypro:PropertyDefinition DisplayName="前景色" Category="颜色设置" Name="Foreground"/>
<mypro:PropertyDefinition DisplayName="背景色" Category="颜色设置" Name="Background"/>
@@ -316,6 +319,19 @@
</DataTemplate>
</mypro:EditorTemplateDefinition.EditingTemplate>
</mypro:EditorTemplateDefinition>
<!--子控件模板编辑-->
<mypro:EditorTemplateDefinition TargetProperties="ChildTemplateXml">
<mypro:EditorTemplateDefinition.EditingTemplate>
<DataTemplate>
<Grid>
<ToggleButton Grid.Column="1" Height="30" Content=" 设置控件模板 " Margin="5,0,0,0" Click="ChildToggleButton_Click"></ToggleButton>
<TextBox Text="{Binding Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" Visibility="Collapsed"/>
</Grid>
</DataTemplate>
</mypro:EditorTemplateDefinition.EditingTemplate>
</mypro:EditorTemplateDefinition>

<!--代码绑定模块-->
<mypro:EditorTemplateDefinition TargetProperties="ClickExec,ValueChangedExecute,TikcExecute,CheckedExec,UnCheckedExec" >
@@ -383,8 +399,14 @@
<ComboBox x:Name="valuebox" DropDownOpened="valuebox_DropDownOpened" Grid.Column="2" Height="25" IsTextSearchEnabled="True" IsEditable="True" Tag="{Binding Text, ElementName=namebox}" TextBoxBase.TextChanged="ComboBoxValue_TextChanged"
ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl},Path=DataContext.DevValueList}"/>
</Grid>
<TextBox Grid.Row="2" x:Name="wenben" Padding="5" Text="{Binding Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"></TextBox>

<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="40"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="2" x:Name="wenben" Padding="5" Text="{Binding Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"></TextBox>
<ToggleButton Grid.Column="1" Height="20" Content="绑定" Width="30" Margin="5,0,5,0" HorizontalAlignment="Left" Click="BingToggleButton_Click"></ToggleButton>
</Grid>
</Grid>
</DataTemplate>
</mypro:EditorTemplateDefinition.EditingTemplate>


+ 128
- 1
BeDesignerSCADA/Controls/MainCanvasPanel.xaml.cs View File

@@ -6,6 +6,7 @@ using BPASmartClient.DATABUS;
using BPASmartClient.MessageName;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Reflection;
@@ -18,6 +19,7 @@ using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
@@ -40,7 +42,8 @@ namespace BeDesignerSCADA.Controls
public MainCanvasPanel(string _Path)
{
InitializeComponent();
Path= _Path;
EditorHelper.Register<BindingExpression, BindingConvertor>();
Path = _Path;
this.DataContext = viewModel;
viewModel.Loaded(cav, runCanvas);
//控件加载
@@ -200,6 +203,44 @@ namespace BeDesignerSCADA.Controls

}
}
/// <summary>
/// 根据流加载数据
/// </summary>
public void LoadFrameworkElement(UIElementCollection frameworks)
{
try
{
cav.Children.Clear();
foreach (FrameworkElement element in frameworks)
{
string xamlText = XamlWriter.Save(element);
FrameworkElement item = XamlReader.Parse(xamlText) as FrameworkElement;
cav.Children.Add(item);
}
cav.SelectedItems?.Clear();
}
catch (Exception ex)
{

throw;
}
}
/// <summary>
/// 获取所有控件
/// </summary>
/// <returns></returns>
public List<FrameworkElement> GetChildren()
{
List<FrameworkElement> frameworks = new List<FrameworkElement>();
foreach (FrameworkElement child in cav.Children)
{
string xamlText = XamlWriter.Save(child);
FrameworkElement item = XamlReader.Parse(xamlText) as FrameworkElement;
frameworks.Add(item);
}
return frameworks;
}

/// <summary>
/// 保存文件
/// </summary>
@@ -359,6 +400,55 @@ namespace BeDesignerSCADA.Controls
}
}
/// <summary>
/// 设置子控件模板
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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)
{

}
}
/// <summary>
/// 数据绑定
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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)
{

}
}
/// <summary>
/// 变量选择
/// </summary>
/// <param name="sender"></param>
@@ -453,6 +543,43 @@ namespace BeDesignerSCADA.Controls
}
communication?.CommunicationDevices?.ToList().ForEach(x => { viewModel.DevNameList.Add(x.DeviceName); });
}

#endregion

}

internal class BindingConvertor : ExpressionConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
{
if (destinationType == typeof(MarkupExtension))
return true;
else return false;
}
public override object ConvertTo(ITypeDescriptorContext context,
System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(MarkupExtension))
{
BindingExpression bindingExpression = value as BindingExpression;
if (bindingExpression == null)
throw new Exception();
return bindingExpression.ParentBinding;
}

return base.ConvertTo(context, culture, value, destinationType);
}
}

internal static class EditorHelper
{
public static void Register<T, TC>()
{
Attribute[] attr = new Attribute[1];
TypeConverterAttribute vConv = new TypeConverterAttribute(typeof(TC));
attr[0] = vConv;
TypeDescriptor.AddAttributes(typeof(T), attr);
}
}
}

+ 38
- 0
BeDesignerSCADA/View/ChildEditWindow.xaml View File

@@ -0,0 +1,38 @@
<Window x:Class="BeDesignerSCADA.View.ChildEditWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:BeDesignerSCADA.View"
mc:Ignorable="d"
Title="子控件编辑器" Height="800" Width="920"
Background="White"
BorderBrush="#FFDEDEDE"
BorderThickness="1"
WindowState="Maximized"
WindowStartupLocation="CenterOwner">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/BeDesignerSCADA;component/Themes/Styles.xaml" />
<ResourceDictionary Source="/BPASmartClient.SCADAControl;component/Themes/Generic.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Border x:Name="main">


</Border>

<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Width="80" Height="30" Content="取消" x:Name="CancelBtn" Click="CancelBtn_Click" IsCancel="True"/>
<Button Width="80" Height="30" Content="确认" x:Name="ConfirmBtn" Margin="8 0 4 0" Click="ConfirmBtn_Click"/>
</StackPanel>
</Grid>
</Window>

+ 111
- 0
BeDesignerSCADA/View/ChildEditWindow.xaml.cs View File

@@ -0,0 +1,111 @@
using BeDesignerSCADA.Controls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Xml;

namespace BeDesignerSCADA.View
{
/// <summary>
/// ChildEditWindow.xaml 的交互逻辑
/// </summary>
public partial class ChildEditWindow : Window
{
public ChildEditWindow()
{
InitializeComponent();
EditorHelper.Register<BindingExpression, BindingConvertor>();
Owner = Application.Current.MainWindow;
Closing += (s, e) => { e.Cancel = true; Hide(); };
}

public static ChildEditWindow Instance { get; } = new ChildEditWindow();

public static string ShowEdit(string xml)
{
try
{
// 获取所有控件的可用属性
Instance.main.Child = new MainCanvasPanel("");
if (!string.IsNullOrEmpty(xml))
{
FrameworkElement element = XamlReader.Parse(xml) as FrameworkElement;
if (element != null && element is Canvas)
{
(Instance.main.Child as MainCanvasPanel).LoadFrameworkElement(((element as Canvas).Children));
}
}
Instance.ShowDialog();

if (Instance.IsOk)
{
Canvas grid =new Canvas();
(Instance.main.Child as MainCanvasPanel).GetChildren()?.ForEach(child => {
grid.Children.Add(child);
});
return FrameworkElementToXml(grid);
}
else
{
return xml;
}
}
catch (Exception ex)
{
return xml;
}
}

/// <summary>
/// 流转Xml
/// </summary>
/// <param name="framework"></param>
public static string FrameworkElementToXml(FrameworkElement framework)
{
StringBuilder outstr = new StringBuilder();
try
{
//this code need for right XML fomating
XmlWriterSettings settings = new XmlWriterSettings
{
Indent = true,
OmitXmlDeclaration = true
};
var dsm = new XamlDesignerSerializationManager(XmlWriter.Create(outstr, settings))
{
//this string need for turning on expression saving mode
XamlWriterMode = XamlWriterMode.Expression
};

XamlWriter.Save(framework, dsm);
}
catch (Exception ex) { }
return outstr.ToString();
}

public bool IsOk { get; set; }
private void CancelBtn_Click(object sender, RoutedEventArgs e)
{
IsOk = false;
Close();
}

private void ConfirmBtn_Click(object sender, RoutedEventArgs e)
{
IsOk = true;
Close();
}
}
}

+ 1
- 2
BeDesignerSCADA/View/JsEditWindow.xaml View File

@@ -11,8 +11,7 @@
BorderBrush="#FFDEDEDE"
BorderThickness="1"
ResizeMode="NoResize"
WindowStartupLocation="CenterOwner"
WindowStyle="None">
WindowStartupLocation="CenterOwner">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>


+ 28
- 27
BeDesignerSCADA/ViewModel/MainViewModelNew.cs View File

@@ -37,8 +37,6 @@ namespace BeDesignerSCADA.ViewModel
{
IsRunning = !IsRunning;
});
//DevNameList = new ObservableCollection<string>() { "qqqq", "wewew" };
//DataBusModel.GetInstance().RefreshTheVariableManagerAction += RefreshTheVariableManagerActionHader;
}

#region 变量
@@ -46,10 +44,7 @@ namespace BeDesignerSCADA.ViewModel
/// 变量管理器地址
/// </summary>
public string VariablePath = string.Empty;
/// <summary>
/// 当前变量管理器变量
/// </summary>
public CommunicationPar communicationPar = new CommunicationPar();

/// <summary>
/// 是否正在运行状态
/// </summary>
@@ -207,27 +202,6 @@ namespace BeDesignerSCADA.ViewModel
{
textEditor.Text = canvasPanel.Save();
}
/// <summary>
/// 刷新变量
/// </summary>
/// <param name="path"></param>
public void RefreshTheVariableManagerActionHader(string path)
{
try
{
//if (path == VariablePath && !string.IsNullOrEmpty(VariablePath))
//{
// if (DataBusModel.GetInstance().KeyValues.ContainsKey(VariablePath))
// {
// communicationPar = DataBusModel.GetInstance().KeyValues[VariablePath];
// }
//}
}
catch (Exception ex)
{

}
}
#endregion

#region 脚本编辑数据
@@ -258,6 +232,31 @@ namespace BeDesignerSCADA.ViewModel
string result = JsEditWindow.ShowEdit(((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value?.ToString(), canvasPanel.GetAllExecChildren());
((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value = result;
}
/// <summary>
/// 子控件编辑
/// </summary>
/// <param name="obj"></param>
public void ChildEdit(object obj)
{
string xml = ChildEditWindow.ShowEdit(((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value?.ToString());
((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value = xml;
}
/// <summary>
/// 绑定编辑
/// </summary>
/// <param name="obj"></param>
public void BingEdit(object obj)
{
//System.Windows.Data.Binding bindingtextBlock = new System.Windows.Data.Binding("alarmMessage");
//textBlock.SetBinding(TextBlock.TextProperty, bindingtextBlock);
// ((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).SetBinding(((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value, "name");



//string xml = ChildEditWindow.ShowEdit(((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value?.ToString());
//((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value = xml;
}
/// <summary>
/// 图片选择路径
/// </summary>
@@ -271,6 +270,8 @@ namespace BeDesignerSCADA.ViewModel
((Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem)obj).Value = ofd.FileName;
}
}


#endregion
}
}

Loading…
Cancel
Save