diff --git a/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs b/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs index 79992fb..d298da2 100644 --- a/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs +++ b/AIStudio.Wpf.ADiagram/Models/PathToolBoxData.cs @@ -56,12 +56,13 @@ namespace AIStudio.Wpf.ADiagram.Models public class SFCToolBoxData : ToolBoxData { public SFCNodeKinds Kind { get; set; } - public SFCToolBoxData(SFCNodeKinds kind, Type type, double width = 32, double height = 32) : base(kind.GetDescription(), null, type, width, height) + public SFCToolBoxData(SFCNodeKinds kind, Type type, double width = 32, double height = 32) : base(null, null, type, width, height) { Kind = kind; ColorViewModel.LineColor.Color = Colors.Black; - } + ColorViewModel.FillColor.Color = Colors.Blue; + } } public class DesignerItemToolBoxData : ToolBoxData diff --git a/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs index bd0b73f..bc0aeaf 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/DiagramsViewModel.cs @@ -772,7 +772,7 @@ namespace AIStudio.Wpf.ADiagram.ViewModels } } - public void CenterExecuted(object para) + public void CenterMoveExecuted(object para) { foreach (var item in DiagramViewModel.SelectedItems.OfType()) { @@ -781,6 +781,38 @@ namespace AIStudio.Wpf.ADiagram.ViewModels } } + public void LeftMoveExecuted(object para) + { + foreach (var item in DiagramViewModel.SelectedItems.OfType()) + { + item.Left -= 0.5; + } + } + + public void RightMoveExecuted(object para) + { + foreach (var item in DiagramViewModel.SelectedItems.OfType()) + { + item.Left += 0.5; + } + } + + public void UpMoveExecuted(object para) + { + foreach (var item in DiagramViewModel.SelectedItems.OfType()) + { + item.Top -= 0.5; + } + } + + public void DownMoveExecuted(object para) + { + foreach (var item in DiagramViewModel.SelectedItems.OfType()) + { + item.Top += 0.5; + } + } + public void SameWidthExecuted(object para) { if (para is DesignerItemViewModelBase designerItem) diff --git a/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs index dec20aa..eb31c35 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/FlowchartViewModel.cs @@ -98,7 +98,7 @@ namespace AIStudio.Wpf.Flowchart DiagramViewModel.ClearSelectedItems(); - FlowchartService.InitOAData(DiagramViewModel.Items.OfType().ToList(), DiagramViewModel.Items.OfType().ToList()); + FlowchartService.InitData(DiagramViewModel.Items.OfType().ToList(), DiagramViewModel.Items.OfType().ToList()); } diff --git a/AIStudio.Wpf.ADiagram/ViewModels/MainWindowViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/MainWindowViewModel.cs index fb28015..1f28062 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/MainWindowViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/MainWindowViewModel.cs @@ -461,7 +461,7 @@ namespace AIStudio.Wpf.ADiagram.ViewModels { get { - return this._centerCommand ?? (this._centerCommand = new DelegateCommand(para => this.CenterExecuted(para))); + return this._centerCommand ?? (this._centerCommand = new DelegateCommand(para => this.CenterMoveExecuted(para))); } } @@ -706,8 +706,9 @@ namespace AIStudio.Wpf.ADiagram.ViewModels } - private void KeyExecuted(string para) + public bool KeyExecuted(string para) { + bool executed = true; switch (para) { case "Control+A": SelectedAllExecuted(); break; @@ -719,8 +720,15 @@ namespace AIStudio.Wpf.ADiagram.ViewModels case "Control+S": SaveExecuted(); break; case "Control+Z": UnDoExecuted(); break; case "Control+Y": ReDoExecuted(); break; - case "None+Delete": DeleteExecuted(); break; + case "Delete": DeleteExecuted(); break; + case "Left": LeftMoveExecuted(); break; + case "Right": RightMoveExecuted(); break; + case "Up": UpMoveExecuted(); break; + case "Down": DownMoveExecuted(); break; + default: executed = false; break; } + + return executed; } private void UnDoExecuted() @@ -889,6 +897,10 @@ namespace AIStudio.Wpf.ADiagram.ViewModels { DiagramsViewModel = new LogicalViewModel(NewNameHelper.GetNewName(DiagramsViewModels.Select(p => p.Title), "新建-"), "*", (DiagramType)Enum.Parse(typeof(DiagramType), type)); } + else if (type == DiagramType.SFC.ToString()) + { + DiagramsViewModel = new SFCViewModel(NewNameHelper.GetNewName(DiagramsViewModels.Select(p => p.Title), "新建-"), "*", (DiagramType)Enum.Parse(typeof(DiagramType), type)); + } else { DiagramsViewModel = new DiagramsViewModel(NewNameHelper.GetNewName(DiagramsViewModels.Select(p => p.Title), "新建-"), "*", (DiagramType)Enum.Parse(typeof(DiagramType), type)); @@ -993,11 +1005,39 @@ namespace AIStudio.Wpf.ADiagram.ViewModels } #endregion - private void CenterExecuted(object para) + private void CenterMoveExecuted(object para) { if (DiagramsViewModel == null) return; - DiagramsViewModel.CenterExecuted(para); + DiagramsViewModel.CenterMoveExecuted(para); + } + + private void LeftMoveExecuted(object para = null) + { + if (DiagramsViewModel == null) return; + + DiagramsViewModel.LeftMoveExecuted(para); + } + + private void RightMoveExecuted(object para = null) + { + if (DiagramsViewModel == null) return; + + DiagramsViewModel.RightMoveExecuted(para); + } + + private void UpMoveExecuted(object para = null) + { + if (DiagramsViewModel == null) return; + + DiagramsViewModel.UpMoveExecuted(para); + } + + private void DownMoveExecuted(object para = null) + { + if (DiagramsViewModel == null) return; + + DiagramsViewModel.DownMoveExecuted(para); } private void SameWidthExecuted(object para) diff --git a/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs new file mode 100644 index 0000000..d61e1fd --- /dev/null +++ b/AIStudio.Wpf.ADiagram/ViewModels/SFCViewModel.cs @@ -0,0 +1,247 @@ +using AIStudio.Wpf.ADiagram.ViewModels; +using AIStudio.Wpf.Flowchart.ViewModels; +using AIStudio.Wpf.SFC; +using AIStudio.Wpf.SFC.ViewModels; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Media; +using Util.DiagramDesigner; + +namespace AIStudio.Wpf.Flowchart +{ + public class SFCViewModel : DiagramsViewModel + { + public SFCViewModel(string title, string status, DiagramType diagramType) : base(title, status, diagramType) + { + + } + public SFCViewModel(string filename) : base(filename) + { + + } + + protected override void InitDiagramViewModel() + { + base.InitDiagramViewModel(); + + DiagramViewModel.ShowGrid = true; + DiagramViewModel.GridCellSize = new Size(100, 60); + DiagramViewModel.CellHorizontalAlignment = CellHorizontalAlignment.Center; + DiagramViewModel.CellVerticalAlignment = CellVerticalAlignment.Center; + } + + protected override void Init() + { + base.Init(); + + SFCStartNode start = new SFCStartNode() { Left = 0, Top = 60, Text = "S0" }; + DiagramViewModel.DirectAddItemCommand.Execute(start); + + SFCConditionNode condition1 = new SFCConditionNode() { Left = 0, Top = 120, Text = "X0" }; + DiagramViewModel.DirectAddItemCommand.Execute(condition1); + + SFCNodeNode step1 = new SFCNodeNode() { Left = 0, Top = 180, Text = "S1" }; + DiagramViewModel.DirectAddItemCommand.Execute(step1); + + SFCActionNode action11 = new SFCActionNode() { Left = 100, Top = 180, Text = "SET_V1" }; + DiagramViewModel.DirectAddItemCommand.Execute(action11); + + SFCActionNode action12 = new SFCActionNode() { Left = 200, Top = 180, Text = "SET_V2" }; + DiagramViewModel.DirectAddItemCommand.Execute(action12); + + SFCActionNode action13 = new SFCActionNode() { Left = 300, Top = 180, Text = "SET_V3" }; + DiagramViewModel.DirectAddItemCommand.Execute(action13); + + SFCActionNode action14 = new SFCActionNode() { Left = 400, Top = 180, Text = "RES_V4" }; + DiagramViewModel.DirectAddItemCommand.Execute(action14); + + SFCConditionNode condition2 = new SFCConditionNode() { Left = 0, Top = 240, Text = "X1" }; + DiagramViewModel.DirectAddItemCommand.Execute(condition2); + + SFCNodeNode step2 = new SFCNodeNode() { Left = 0, Top = 300, Text = "S2" }; + DiagramViewModel.DirectAddItemCommand.Execute(step2); + + SFCActionNode action2 = new SFCActionNode() { Left = 100, Top = 300, Text = "SET_V4" }; + DiagramViewModel.DirectAddItemCommand.Execute(action2); + + SFCConditionNode condition3 = new SFCConditionNode() { Left = 0, Top = 360, Text = "X2" }; + DiagramViewModel.DirectAddItemCommand.Execute(condition3); + + SFCNodeNode step3 = new SFCNodeNode() { Left = 0, Top = 420, Text = "S3" }; + DiagramViewModel.DirectAddItemCommand.Execute(step3); + + SFCActionNode action3 = new SFCActionNode() { Left = 100, Top = 420, Text = "RES_V1" }; + DiagramViewModel.DirectAddItemCommand.Execute(action3); + + SFCConditionNode condition4 = new SFCConditionNode() { Left = 0, Top = 480, Text = "X4" }; + DiagramViewModel.DirectAddItemCommand.Execute(condition4); + + SFCCOBeginNode cobegin = new SFCCOBeginNode() { Left = 38, Top = 540, Text = "" }; + DiagramViewModel.DirectAddItemCommand.Execute(cobegin); + + SFCNodeNode step4 = new SFCNodeNode() { Left = 0, Top = 600, Text = "S4" }; + DiagramViewModel.DirectAddItemCommand.Execute(step4); + + SFCActionNode action4 = new SFCActionNode() { Left = 100, Top = 600, Text = "RES_V2" }; + DiagramViewModel.DirectAddItemCommand.Execute(action4); + + SFCNodeNode step5 = new SFCNodeNode() { Left = 200, Top = 600, Text = "S5" }; + DiagramViewModel.DirectAddItemCommand.Execute(step5); + + SFCActionNode action5 = new SFCActionNode() { Left = 300, Top = 600, Text = "RES_V3" }; + DiagramViewModel.DirectAddItemCommand.Execute(action5); + + SFCCOEndNode coend = new SFCCOEndNode() { Left = 38, Top = 660, Text = "" }; + DiagramViewModel.DirectAddItemCommand.Execute(coend); + + ConnectorViewModel connector1 = new ConnectorViewModel(start.Output[0], condition1.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector1); + + ConnectorViewModel connector2 = new ConnectorViewModel(condition1.Output[0], step1.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector2); + + ConnectorViewModel connector31 = new ConnectorViewModel(step1.Action[0], action11.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector31); + + ConnectorViewModel connector32 = new ConnectorViewModel(step1.Action[0], action12.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector32); + + ConnectorViewModel connector33 = new ConnectorViewModel(step1.Action[0], action13.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector33); + + ConnectorViewModel connector34 = new ConnectorViewModel(step1.Action[0], action14.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector34); + + ConnectorViewModel connector4 = new ConnectorViewModel(step1.Output[0], condition2.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector4); + + ConnectorViewModel connector5 = new ConnectorViewModel(condition2.Output[0], step2.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector5); + + ConnectorViewModel connector6 = new ConnectorViewModel(step2.Action[0], action2.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector6); + + ConnectorViewModel connector7 = new ConnectorViewModel(step2.Output[0], condition3.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector7); + + ConnectorViewModel connector8 = new ConnectorViewModel(condition3.Output[0], step3.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector8); + + ConnectorViewModel connector9 = new ConnectorViewModel(step3.Action[0], action3.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector9); + + ConnectorViewModel connector10 = new ConnectorViewModel(step3.Output[0], condition4.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector10); + + ConnectorViewModel connector11 = new ConnectorViewModel(condition4.Output[0], cobegin.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector11); + + ConnectorViewModel connector12 = new ConnectorViewModel(cobegin.Output[0], step4.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector12); + + ConnectorViewModel connector13 = new ConnectorViewModel(step4.Action[0], action4.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector13); + + ConnectorViewModel connector14 = new ConnectorViewModel(cobegin.Output[1], step5.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector14); + + ConnectorViewModel connector15 = new ConnectorViewModel(step5.Action[0], action5.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector15); + + ConnectorViewModel connector16 = new ConnectorViewModel(step4.Output[0], coend.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector16); + + ConnectorViewModel connector17 = new ConnectorViewModel(step5.Output[0], coend.Input[1]); + DiagramViewModel.DirectAddItemCommand.Execute(connector17); + + ConnectorViewModel connector18 = new ConnectorViewModel(coend.Output[0], start.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(connector18); + + #region 模拟部分 + TextDesignerItemViewModel despcription = new TextDesignerItemViewModel() + { + Left = 230, + Top = 270, + ItemWidth = 300, + ItemHeight = 120, + Text = @"模拟一个容器的高低液位控制方法 +1.按下启动按钮, 程序启动 +2.当液位低于20%的时候, V1,V2,V3打开, V4关闭 +3.当液位高于50%的时候, V4打开 +4.当液位高于70%的时侯, V1关闭 +5.当液位高于80%的时候, V2,V3并行关闭" + }; + despcription.FontViewModel.HorizontalAlignment = HorizontalAlignment.Left; + despcription.FontViewModel.VerticalAlignment = VerticalAlignment.Top; + DiagramViewModel.DirectAddItemCommand.Execute(despcription); + + Simulate_ListViewModel list = new Simulate_ListViewModel() + { + Left = 410, + Top = 390, + }; + DiagramViewModel.DirectAddItemCommand.Execute(list); + + Simulate_StartViewModel btnstart = new Simulate_StartViewModel() { Left = 0, Top = 0, LinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "S0"), }; + DiagramViewModel.DirectAddItemCommand.Execute(btnstart); + + Simulate_TankViewModel tank1 = new Simulate_TankViewModel() { Left = 100, Top = 43, ItemWidth = 48, ItemHeight = 60, Text = "T1", LinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "T1") }; + DiagramViewModel.DirectAddItemCommand.Execute(tank1); + + Simulate_SolenoidViewModel k1 = new Simulate_SolenoidViewModel() { Left = 200, Top = 0, Text = "K1", DILinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K1_DI"), DOLinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K1_DO") }; + DiagramViewModel.DirectAddItemCommand.Execute(k1); + + Simulate_SolenoidViewModel k2 = new Simulate_SolenoidViewModel() { Left = 200, Top = 60, Text = "K2", DILinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K2_DI"), DOLinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K2_DO") }; + DiagramViewModel.DirectAddItemCommand.Execute(k2); + + Simulate_SolenoidViewModel k3 = new Simulate_SolenoidViewModel() { Left = 200, Top = 120, Text = "K3", DILinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K3_DI"), DOLinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K3_DO") }; + DiagramViewModel.DirectAddItemCommand.Execute(k3); + + Simulate_TankViewModel tank2 = new Simulate_TankViewModel() { Left = 300, Top = 28, Text = "T2", LinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "T2") }; + + DiagramViewModel.DirectAddItemCommand.Execute(tank2); + + Simulate_SolenoidViewModel k4 = new Simulate_SolenoidViewModel() { Left = 400, Top = 60, Text = "K4", DILinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K4_DI"), DOLinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "K4_DO") }; + DiagramViewModel.DirectAddItemCommand.Execute(k4); + + Simulate_TankViewModel tank3 = new Simulate_TankViewModel() { Left = 500, Top = 103, ItemWidth = 48, ItemHeight = 60, Text = "T3", LinkPoint = SFCService.LinkPoint.FirstOrDefault(p => p.Name == "T3") }; + DiagramViewModel.DirectAddItemCommand.Execute(tank3); + + ConnectorViewModel conn1 = new ConnectorViewModel(tank1.Output[0], k1.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn1); + + ConnectorViewModel conn2 = new ConnectorViewModel(tank1.Output[0], k2.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn2); + + ConnectorViewModel conn3 = new ConnectorViewModel(tank1.Output[0], k3.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn3); + + ConnectorViewModel conn4 = new ConnectorViewModel(k1.Output[0], tank2.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn4); + + ConnectorViewModel conn5 = new ConnectorViewModel(k2.Output[0], tank2.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn5); + + ConnectorViewModel conn6 = new ConnectorViewModel(k3.Output[0], tank2.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn6); + + ConnectorViewModel conn7 = new ConnectorViewModel(tank2.Output[1], k4.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn7); + + ConnectorViewModel conn8 = new ConnectorViewModel(k4.Output[0], tank3.Input[0]); + DiagramViewModel.DirectAddItemCommand.Execute(conn8); + #endregion + + DiagramViewModel.ClearSelectedItems(); + + + } + + + } +} diff --git a/AIStudio.Wpf.ADiagram/ViewModels/ToolBoxViewModel.cs b/AIStudio.Wpf.ADiagram/ViewModels/ToolBoxViewModel.cs index 86652f4..bd838de 100644 --- a/AIStudio.Wpf.ADiagram/ViewModels/ToolBoxViewModel.cs +++ b/AIStudio.Wpf.ADiagram/ViewModels/ToolBoxViewModel.cs @@ -15,6 +15,7 @@ using Util.DiagramDesigner; using Util.DiagramDesigner.Helpers; using AIStudio.Wpf.SFC; using AIStudio.Wpf.SFC.ViewModels; +using System.Windows.Media; namespace AIStudio.Wpf.ADiagram.ViewModels { @@ -186,7 +187,9 @@ namespace AIStudio.Wpf.ADiagram.ViewModels sfcToolBoxItems.Add(new SFCToolBoxData(SFCNodeKinds.Action, typeof(SFCActionNode), 32, 28)); sfcToolBoxItems.Add(new SFCToolBoxData(SFCNodeKinds.COBegin, typeof(SFCCOBeginNode), 32, 10)); sfcToolBoxItems.Add(new SFCToolBoxData(SFCNodeKinds.COEnd, typeof(SFCCOEndNode), 32, 10)); - + sfcToolBoxItems.Add(new SFCToolBoxData(SFCNodeKinds.Simulate_Tank, typeof(Simulate_TankViewModel), 32, 32)); + sfcToolBoxItems.Add(new SFCToolBoxData(SFCNodeKinds.Simulate_Solenoid, typeof(Simulate_SolenoidViewModel))); + sfcToolBoxItems.Add(new SFCToolBoxData(SFCNodeKinds.Simulate_Start, typeof(Simulate_StartViewModel))); ToolBoxCategory.Add(new ToolBoxCategory() { Header = "SFC顺序控制图", ToolBoxItems = new ObservableCollection(sfcToolBoxItems) }); LoadMyItems(); diff --git a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml index a936ddb..6e54a69 100644 --- a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml +++ b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml @@ -91,6 +91,9 @@ + diff --git a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml.cs b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml.cs index a2aa2dd..6d8b7ac 100644 --- a/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml.cs +++ b/AIStudio.Wpf.ADiagram/Views/MainWindow.xaml.cs @@ -40,10 +40,8 @@ namespace AIStudio.Wpf.ADiagram protected override void OnPreviewKeyDown(KeyEventArgs e) { - base.OnPreviewKeyDown(e); - - MainWindowViewModel.KeyCommand.Execute(e.KeyboardDevice.Modifiers.ToString() + "+" + e.Key.ToString()); - } + e.Handled = MainWindowViewModel.KeyExecuted(e.KeyboardDevice.Modifiers == ModifierKeys.None ? e.Key.ToString() : e.KeyboardDevice.Modifiers.ToString() + "+" + e.Key.ToString()); + } private void HookEvents() { diff --git a/AIStudio.Wpf.ADiagram/Views/ToolBoxControl.xaml b/AIStudio.Wpf.ADiagram/Views/ToolBoxControl.xaml index 25b0ed1..55b561f 100644 --- a/AIStudio.Wpf.ADiagram/Views/ToolBoxControl.xaml +++ b/AIStudio.Wpf.ADiagram/Views/ToolBoxControl.xaml @@ -16,8 +16,10 @@ + + - + @@ -178,14 +180,14 @@ - + - - + + diff --git a/AIStudio.Wpf.BaseDiagram/Converters/Converters.cs b/AIStudio.Wpf.BaseDiagram/Converters/Converters.cs new file mode 100644 index 0000000..bac4b54 --- /dev/null +++ b/AIStudio.Wpf.BaseDiagram/Converters/Converters.cs @@ -0,0 +1,176 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace AIStudio.Wpf.BaseDiagram.Converters +{ + #region Half + public class HalfConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var doubleValue = (value as double?).GetValueOrDefault(); + + return doubleValue / 2; + } + + public object ConvertBack(object value, Type targetTypes, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + #endregion + + #region String IsNullOrEmpty + public class IsNullOrEmptyConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return string.IsNullOrEmpty((string)value); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + #endregion + + #region True -> False + public class BoolInverseConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return !(bool)value; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + #endregion + + #region True -> Visible Or Collpased + public class BoolToVisibleConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return (bool)value ? Visibility.Visible : Visibility.Collapsed; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + + public class BoolToInvisibleConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return (bool)value ? Visibility.Collapsed : Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + #endregion + + #region object try to convert to image (if is uri) + public class IconConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value == null || !(value.GetType() == typeof(string))) + return value; + + var iconString = value as string; + + if (!string.IsNullOrEmpty(iconString) && Uri.IsWellFormedUriString(iconString, UriKind.RelativeOrAbsolute)) + { + var image = new System.Windows.Controls.Image() + { + Source = new System.Windows.Media.Imaging.BitmapImage(new Uri(iconString, UriKind.RelativeOrAbsolute)), + }; + System.Windows.Media.RenderOptions.SetBitmapScalingMode(image, System.Windows.Media.BitmapScalingMode.HighQuality); + return image; + } + return value; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + #endregion + + #region Double -> GridLength + public class GridLengthConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var length = value?.ToString(); + try + { + return (GridLength)TypeDescriptor.GetConverter(typeof(GridLength)).ConvertFromString(length); + } + catch + { + return new GridLength(1, GridUnitType.Auto); + } + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + #endregion + + #region Combiner + public class MultiCombinerConverter : IMultiValueConverter + { + public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) + { + return values.Clone(); + } + + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) + { + return new object[] { DependencyProperty.UnsetValue, DependencyProperty.UnsetValue }; + } + } + #endregion + + #region NotAlignmentCenter + public class NotAlignmentCenterConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is HorizontalAlignment) + { + var alignment = (HorizontalAlignment)value; + return alignment != HorizontalAlignment.Center; + } + else if (value is VerticalAlignment) + { + var alignment = (VerticalAlignment)value; + return alignment != VerticalAlignment.Center; + } + else + return true; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return DependencyProperty.UnsetValue; + } + } + #endregion +} diff --git a/AIStudio.Wpf.BaseDiagram/Converters/IntToBoolConverter.cs b/AIStudio.Wpf.BaseDiagram/Converters/IntToBoolConverter.cs new file mode 100644 index 0000000..9e01348 --- /dev/null +++ b/AIStudio.Wpf.BaseDiagram/Converters/IntToBoolConverter.cs @@ -0,0 +1,24 @@ +using System; +using System.Windows.Data; + +namespace AIStudio.Wpf.BaseDiagram.Converters +{ + public class IntToBoolConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (object.Equals(value, 0d)) + return false; + else + return true; + } + + public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + if (object.Equals(value, false)) + return 0d; + else + return 1d; + } + } +} diff --git a/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs b/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs index 647fba5..646afe3 100644 --- a/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs +++ b/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/BarcodeDesignerItemViewModel.cs @@ -31,7 +31,6 @@ namespace AIStudio.Wpf.BaseDiagram.Extensions.ViewModels base.LoadDesignerItemViewModel(parent, designerbase); Format = (BarcodeFormat)Enum.Parse(typeof(BarcodeFormat), (designerbase as DesignerItemBase).Reserve.ToString()); - ShowText = false; } public void AutoSize() @@ -54,6 +53,19 @@ namespace AIStudio.Wpf.BaseDiagram.Extensions.ViewModels public BarcodeFormat Format { get; set; } = BarcodeFormat.QR_CODE; + private bool _showText; + public override bool ShowText + { + get + { + return false; + } + set + { + SetProperty(ref _showText, value); + } + } + public override bool EditData() { if (IsReadOnly == true) return false; @@ -63,7 +75,6 @@ namespace AIStudio.Wpf.BaseDiagram.Extensions.ViewModels { bool needauto = Text == null; Text = data.Text; - ShowText = false; Icon = data.Icon; Margin = data.Margin; if (needauto) diff --git a/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/PersistDesignerItemViewModel.xaml b/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/PersistDesignerItemViewModel.xaml index c66ade0..91002d5 100644 --- a/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/PersistDesignerItemViewModel.xaml +++ b/AIStudio.Wpf.BaseDiagram/Extensions/ViewModels/PersistDesignerItemViewModel.xaml @@ -48,7 +48,7 @@