From db7f62beafa09e14ecbab1146b157d5978088a4d Mon Sep 17 00:00:00 2001 From: xcd <834800634@qq.com> Date: 星期三, 15 七月 2020 11:14:04 +0800 Subject: [PATCH] M071主界面添加批量添加测量项界面 修复CanvasImage复数显示时无法编辑标签问题 --- src/Bro.M071.Process/UI/M071_MainForm.cs | 22 ++ src/Bro.UI.Model.Winform/UI/CanvasImage.cs | 3 src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.resx | 120 +++++++++++++ src/Bro.UI.Model.Winform/ElementBase.cs | 2 src/Bro.M071.Process/UI/M071_MainForm.Designer.cs | 20 + src/Bro.UI.Model.Winform/CommonHelper.cs | 7 src/Bro.M071.Process/Bro.M071.Process.csproj | 9 + src/Bro.M071.Process/M071Config.cs | 9 src/Bro.M071.Process/M071Models.cs | 26 ++ src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.Designer.cs | 133 ++++++++++++++ src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.cs | 161 +++++++++++++++++ 11 files changed, 501 insertions(+), 11 deletions(-) diff --git a/src/Bro.M071.Process/Bro.M071.Process.csproj b/src/Bro.M071.Process/Bro.M071.Process.csproj index e8c6f29..60f4879 100644 --- a/src/Bro.M071.Process/Bro.M071.Process.csproj +++ b/src/Bro.M071.Process/Bro.M071.Process.csproj @@ -131,6 +131,12 @@ <Compile Include="UI\M071_MainForm.Designer.cs"> <DependentUpon>M071_MainForm.cs</DependentUpon> </Compile> + <Compile Include="UI\M071_PatchInsertMeasurement.cs"> + <SubType>Form</SubType> + </Compile> + <Compile Include="UI\M071_PatchInsertMeasurement.Designer.cs"> + <DependentUpon>M071_PatchInsertMeasurement.cs</DependentUpon> + </Compile> <Compile Include="UI\M071_ShortcutFrm.cs"> <SubType>Form</SubType> </Compile> @@ -152,6 +158,9 @@ <EmbeddedResource Include="UI\M071_MainForm.resx"> <DependentUpon>M071_MainForm.cs</DependentUpon> </EmbeddedResource> + <EmbeddedResource Include="UI\M071_PatchInsertMeasurement.resx"> + <DependentUpon>M071_PatchInsertMeasurement.cs</DependentUpon> + </EmbeddedResource> <EmbeddedResource Include="UI\M071_ShortcutFrm.resx"> <DependentUpon>M071_ShortcutFrm.cs</DependentUpon> </EmbeddedResource> diff --git a/src/Bro.M071.Process/M071Config.cs b/src/Bro.M071.Process/M071Config.cs index fa7ad15..9edb448 100644 --- a/src/Bro.M071.Process/M071Config.cs +++ b/src/Bro.M071.Process/M071Config.cs @@ -41,12 +41,19 @@ public List<KeyResult> KeyResultCollection { get; set; } = new List<KeyResult>(); #endregion - [Category("鑳屾櫙鍥剧墖璁剧疆")] + [Category("鏄剧ず閰嶇疆")] [Description("杩愯鑳屾櫙鍥剧墖璺緞")] [Editor(typeof(FileDialogEditor), typeof(UITypeEditor))] [DisplayName("鑳屾櫙鍥剧墖")] public string BackgroundImagePath { get; set; } + [Category("鏄剧ず閰嶇疆")] + [Description("閿洏鍏抽敭閿綅甯冨眬鏄剧ず")] + [TypeConverter(typeof(CollectionCountConvert))] + [Editor(typeof(ComplexCollectionEditor<KeyLocation>), typeof(UITypeEditor))] + [DisplayName("閿綅鏄剧ず")] + public List<KeyLocation> KeyLocationCollection { get; set; } = new List<KeyLocation>(); + [Category("妫�娴嬭缃�")] [Description("鎷嶆憚鐐逛綅璁剧疆闆嗗悎")] [TypeConverter(typeof(CollectionCountConvert))] diff --git a/src/Bro.M071.Process/M071Models.cs b/src/Bro.M071.Process/M071Models.cs index beb5008..a56f47c 100644 --- a/src/Bro.M071.Process/M071Models.cs +++ b/src/Bro.M071.Process/M071Models.cs @@ -17,6 +17,28 @@ namespace Bro.M071.Process { + public class KeyLocation : IComplexDisplay + { + [Category("閿悕閰嶇疆")] + [Description("鍗曢敭閿悕")] + [TypeConverter(typeof(KeyNameDictConverter))] + public string Key { get; set; } + + [Category("浣嶇疆閰嶇疆")] + [Description("鍗曢敭鍦ㄩ敭鐩樺钩闈㈠浘涓婄殑浣嶇疆鏄剧ず")] + public Rectangle KeyRect { get; set; } = new Rectangle(); + + [Category("浣嶇疆閰嶇疆")] + [Description("鍗曢敭涔嬪悗闂撮殭浣嶇疆")] + public Rectangle IntervalRect { get; set; } = new Rectangle(); + + public string GetDisplayText() + { + return $"{Key}:{KeyRect.X},{KeyRect.Y},{KeyRect.Width},{KeyRect.Height}"; + } + } + + public class KeyAlgorithem : IComplexDisplay { [Browsable(false)] @@ -282,7 +304,7 @@ #region 鏄剧ず [Browsable(false)] - public Rectangle DisplayLocation { get; set; } = new Rectangle(); + public Rectangle DisplayLocation { get; set; } = new Rectangle(10, 10, 100, 100); #endregion #region 妫�娴嬬粨鏋� @@ -391,7 +413,7 @@ { if (valuePairs == null || valuePairs.Count == 0) { - IsDone = false; + IsDone = false; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsDone")); return; } diff --git a/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs b/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs index f72a914..bbe64d2 100644 --- a/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs +++ b/src/Bro.M071.Process/UI/M071_MainForm.Designer.cs @@ -48,6 +48,7 @@ this.lvMeasures = new System.Windows.Forms.ListView(); this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.propGridKeyIndicator = new System.Windows.Forms.PropertyGrid(); + this.tsmiRefreshLabels = new System.Windows.Forms.ToolStripMenuItem(); this.contextMenuStrip1.SuspendLayout(); this.plImage.SuspendLayout(); this.tscEditLocation.ContentPanel.SuspendLayout(); @@ -64,15 +65,16 @@ this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.tsmiShowToolBar, this.tsmiShowStatusBar, - this.tsmiShowEditor}); + this.tsmiShowEditor, + this.tsmiRefreshLabels}); this.contextMenuStrip1.Name = "contextMenuStrip1"; - this.contextMenuStrip1.Size = new System.Drawing.Size(149, 70); + this.contextMenuStrip1.Size = new System.Drawing.Size(181, 114); // // tsmiShowToolBar // this.tsmiShowToolBar.CheckOnClick = true; this.tsmiShowToolBar.Name = "tsmiShowToolBar"; - this.tsmiShowToolBar.Size = new System.Drawing.Size(148, 22); + this.tsmiShowToolBar.Size = new System.Drawing.Size(180, 22); this.tsmiShowToolBar.Text = "鏄剧ず宸ュ叿鏉�"; this.tsmiShowToolBar.CheckedChanged += new System.EventHandler(this.tsmiShowToolBar_CheckedChanged); // @@ -80,7 +82,7 @@ // this.tsmiShowStatusBar.CheckOnClick = true; this.tsmiShowStatusBar.Name = "tsmiShowStatusBar"; - this.tsmiShowStatusBar.Size = new System.Drawing.Size(148, 22); + this.tsmiShowStatusBar.Size = new System.Drawing.Size(180, 22); this.tsmiShowStatusBar.Text = "鏄剧ず鐘舵�佹爮"; this.tsmiShowStatusBar.CheckedChanged += new System.EventHandler(this.tsmiShowStatusBar_CheckedChanged); // @@ -88,7 +90,7 @@ // this.tsmiShowEditor.CheckOnClick = true; this.tsmiShowEditor.Name = "tsmiShowEditor"; - this.tsmiShowEditor.Size = new System.Drawing.Size(148, 22); + this.tsmiShowEditor.Size = new System.Drawing.Size(180, 22); this.tsmiShowEditor.Text = "缂栬緫鏄剧ず鐐逛綅"; this.tsmiShowEditor.CheckedChanged += new System.EventHandler(this.tsmiShowEditor_CheckedChanged); // @@ -291,6 +293,13 @@ this.propGridKeyIndicator.TabIndex = 0; this.propGridKeyIndicator.ToolbarVisible = false; // + // tsmiRefreshLabels + // + this.tsmiRefreshLabels.Name = "tsmiRefreshLabels"; + this.tsmiRefreshLabels.Size = new System.Drawing.Size(180, 22); + this.tsmiRefreshLabels.Text = "鍒锋柊鏄剧ず鐐逛綅"; + this.tsmiRefreshLabels.Click += new System.EventHandler(this.tsmiRefreshLabels_Click); + // // M071_MainForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -343,5 +352,6 @@ private System.Windows.Forms.Button btnStartMeasure; private System.Windows.Forms.Button btnReset; private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ToolStripMenuItem tsmiRefreshLabels; } } \ No newline at end of file diff --git a/src/Bro.M071.Process/UI/M071_MainForm.cs b/src/Bro.M071.Process/UI/M071_MainForm.cs index 6aa59b8..3f2ce31 100644 --- a/src/Bro.M071.Process/UI/M071_MainForm.cs +++ b/src/Bro.M071.Process/UI/M071_MainForm.cs @@ -136,6 +136,27 @@ tscEditLocation.Visible = tsmiShowEditor.Checked; tscEditLocation.BringToFront(); } + + private void tsmiRefreshLabels_Click(object sender, EventArgs e) + { + cvImage.Elements.Clear(); + lvMeasures.Items.Clear(); + + Config.MeasurementUnitCollection.ForEach(u => + { + if (!u.IsEnabled) + return; + + var ele = new KeyIndicator(u.Id, u.DisplayLocation); + cvImage.Elements.Add(ele); + + ListViewItem item = new ListViewItem(u.GetDisplayText()); + item.Tag = u.Id; + lvMeasures.Items.Add(item); + }); + + this.Invalidate(); + } #endregion #region 鏍囩缂栬緫鍖� @@ -453,5 +474,6 @@ Process_M071.ResetTimer.Change(-1, -1); } #endregion + } } diff --git a/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.Designer.cs b/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.Designer.cs new file mode 100644 index 0000000..9a393c9 --- /dev/null +++ b/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.Designer.cs @@ -0,0 +1,133 @@ +锘縩amespace Bro.M071.Process.UI +{ + partial class M071_PatchInsertMeasurement + { + /// <summary> + /// Required designer variable. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Clean up any resources being used. + /// </summary> + /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.cboMeasureType = new System.Windows.Forms.ComboBox(); + this.label2 = new System.Windows.Forms.Label(); + this.cboStartKey = new System.Windows.Forms.ComboBox(); + this.label3 = new System.Windows.Forms.Label(); + this.cboEndKey = new System.Windows.Forms.ComboBox(); + this.btnInsertMeasurement = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(22, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(55, 13); + this.label1.TabIndex = 0; + this.label1.Text = "娴嬮噺绫诲瀷"; + // + // cboMeasureType + // + this.cboMeasureType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboMeasureType.FormattingEnabled = true; + this.cboMeasureType.Location = new System.Drawing.Point(95, 11); + this.cboMeasureType.Name = "cboMeasureType"; + this.cboMeasureType.Size = new System.Drawing.Size(121, 21); + this.cboMeasureType.TabIndex = 1; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(22, 53); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(43, 13); + this.label2.TabIndex = 0; + this.label2.Text = "璧峰閿�"; + // + // cboStartKey + // + this.cboStartKey.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboStartKey.FormattingEnabled = true; + this.cboStartKey.Location = new System.Drawing.Point(95, 50); + this.cboStartKey.Name = "cboStartKey"; + this.cboStartKey.Size = new System.Drawing.Size(121, 21); + this.cboStartKey.TabIndex = 1; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(22, 92); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(43, 13); + this.label3.TabIndex = 0; + this.label3.Text = "缁撴潫閿�"; + // + // cboEndKey + // + this.cboEndKey.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboEndKey.FormattingEnabled = true; + this.cboEndKey.Location = new System.Drawing.Point(95, 89); + this.cboEndKey.Name = "cboEndKey"; + this.cboEndKey.Size = new System.Drawing.Size(121, 21); + this.cboEndKey.TabIndex = 1; + // + // btnInsertMeasurement + // + this.btnInsertMeasurement.Location = new System.Drawing.Point(25, 133); + this.btnInsertMeasurement.Name = "btnInsertMeasurement"; + this.btnInsertMeasurement.Size = new System.Drawing.Size(192, 36); + this.btnInsertMeasurement.TabIndex = 2; + this.btnInsertMeasurement.Text = "鐢熸垚妫�娴嬮」"; + this.btnInsertMeasurement.UseVisualStyleBackColor = true; + this.btnInsertMeasurement.Click += new System.EventHandler(this.btnInsertMeasurement_Click); + // + // M071_PatchInsertMeasurement + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 488); + this.Controls.Add(this.btnInsertMeasurement); + this.Controls.Add(this.cboEndKey); + this.Controls.Add(this.cboStartKey); + this.Controls.Add(this.cboMeasureType); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Name = "M071_PatchInsertMeasurement"; + this.Text = "M071_PatchInsertMeasurement"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cboMeasureType; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.ComboBox cboStartKey; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.ComboBox cboEndKey; + private System.Windows.Forms.Button btnInsertMeasurement; + } +} \ No newline at end of file diff --git a/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.cs b/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.cs new file mode 100644 index 0000000..59f538a --- /dev/null +++ b/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.cs @@ -0,0 +1,161 @@ +锘縰sing Bro.Common.Helper; +using Bro.UI.Model.Winform; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Bro.M071.Process.UI +{ + [MenuNode("M071_PatchInsertMeasurement", "鎵归噺鐢熸垚妫�娴嬮」", 4, "M071Node", true)] + public partial class M071_PatchInsertMeasurement : MenuFrmBase + { + public M071_PatchInsertMeasurement() + { + InitializeComponent(); + } + + M071Config Config => Process?.IConfig as M071Config; + M071Process Process_M071 => Process as M071Process; + + public override void OnProcessUpdated() + { + base.OnProcessUpdated(); + + if (Config == null) + return; + + this.Invoke(new Action(() => + { + UIHelper.SetCombo(cboMeasureType, Config.MeasureTypeCollection, "Code", "Code"); + UIHelper.SetCombo(cboStartKey, new List<string>(Config.KeyNameCollection), "", ""); + UIHelper.SetCombo(cboEndKey, new List<string>(Config.KeyNameCollection), "", ""); + })); + } + + private async void btnInsertMeasurement_Click(object sender, EventArgs e) + { + btnInsertMeasurement.Enabled = false; + btnInsertMeasurement.Text = "鐢熸垚涓�傘�傘��"; + + string measureType = cboMeasureType.Text; + string startKey = cboStartKey.Text; + string endKey = cboEndKey.Text; + + await PatchInsertMeasurement(measureType, startKey, endKey).ContinueWith(t => + { + MessageBox.Show(t.Result); + }); + + btnInsertMeasurement.Enabled = true; + btnInsertMeasurement.Text = "鐢熸垚妫�娴嬮」"; + } + + private async Task<string> PatchInsertMeasurement(string measureType, string startKey, string endKey) + { + return await Task.Run(() => + { + int startIndex = Config.KeyNameCollection.IndexOf(startKey); + int endIndex = Config.KeyNameCollection.IndexOf(endKey); + + KeyLocation startRect = Config.KeyLocationCollection.FirstOrDefault(u => u.Key == startKey); + //KeyLocation endRect = Config.KeyLocationCollection.FirstOrDefault(u => u.Key == endKey); + if (startRect == null) + { + return $"鏈厤缃畕(startRect == null ? startKey : "")}鐨勬樉绀轰綅缃�"; + } + + if (startIndex > endIndex) + { + return "璧峰閿笉鑳藉皬浜庣粨鏉熼敭"; + } + + switch (measureType) + { + case "Slant": + { + for (int i = startIndex; i <= endIndex; i++) + { + int curKeyEdge_X = (i - startIndex + 1) * (startRect.KeyRect.Width + startRect.IntervalRect.Width) + startRect.KeyRect.X - startRect.IntervalRect.Width; + + int lableX = (curKeyEdge_X + curKeyEdge_X - startRect.KeyRect.Width - 25) / 2; + int lable_Up_Y = startRect.KeyRect.Y + (startRect.KeyRect.Height - 25) / 2; + + MeasurementUnit mUnitUp = new MeasurementUnit(); + mUnitUp.MeasureType = measureType; + mUnitUp.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i], KeyResultId = "All" }); + mUnitUp.DisplayLocation = new Rectangle(lableX, lable_Up_Y, 25, 25); + Config.MeasurementUnitCollection.Add(mUnitUp); + } + } + break; + case "Alignment": + { + for (int i = startIndex; i < endIndex; i++) + { + int curKeyEdge_X = (i - startIndex + 1) * (startRect.KeyRect.Width + startRect.IntervalRect.Width) + startRect.KeyRect.X - startRect.IntervalRect.Width; + int nextKeyStart_X = curKeyEdge_X + startRect.IntervalRect.Width; + + int lableX = (curKeyEdge_X + nextKeyStart_X - 25) / 2; + int lable_Up_Y = startRect.KeyRect.Y + 4; + int lable_Down_y = startRect.KeyRect.Y + startRect.KeyRect.Height - 4 - 12; + + MeasurementUnit mUnitUp = new MeasurementUnit(); + mUnitUp.MeasureType = measureType; + mUnitUp.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i], KeyResultId = "Z2" }); + mUnitUp.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i + 1], KeyResultId = "Z1" }); + mUnitUp.DisplayLocation = new Rectangle(lableX, lable_Up_Y, 25, 12); + Config.MeasurementUnitCollection.Add(mUnitUp); + + MeasurementUnit mUnitDown = new MeasurementUnit(); + mUnitDown.MeasureType = measureType; + mUnitDown.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i], KeyResultId = "Z4" }); + mUnitDown.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i + 1], KeyResultId = "Z3" }); + mUnitDown.DisplayLocation = new Rectangle(lableX, lable_Down_y, 25, 12); + Config.MeasurementUnitCollection.Add(mUnitDown); + } + } + break; + case "RowAlignment": + { + int start_X = startRect.KeyRect.X + startRect.KeyRect.Width / 3; + int end_X = (startRect.KeyRect.Width + startRect.IntervalRect.Width) * (endIndex - startIndex) + startRect.KeyRect.X + startRect.KeyRect.Width * 2 / 3; + + int lable_Up_Y = startRect.KeyRect.Y - 6; + int lable_Down_Y = startRect.KeyRect.Y + startRect.KeyRect.Height - 6; + + MeasurementUnit mUnitUp = new MeasurementUnit(); + mUnitUp.MeasureType = measureType; + for (int i = startIndex; i < endIndex; i++) + { + mUnitUp.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i], KeyResultId = "Z2" }); + mUnitUp.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i + 1], KeyResultId = "Z1" }); + } + + mUnitUp.DisplayLocation = new Rectangle(start_X, lable_Up_Y, end_X - start_X, 12); + Config.MeasurementUnitCollection.Add(mUnitUp); + + MeasurementUnit mUnitDown = new MeasurementUnit(); + mUnitDown.MeasureType = measureType; + for (int i = startIndex; i < endIndex; i++) + { + mUnitDown.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i], KeyResultId = "Z4" }); + mUnitDown.KeyUnitCollection.Add(new KeyUnitBind() { Key = Config.KeyNameCollection[i + 1], KeyResultId = "Z3" }); + } + + mUnitDown.DisplayLocation = new Rectangle(start_X, lable_Down_Y, end_X - start_X, 12); + Config.MeasurementUnitCollection.Add(mUnitDown); + } + break; + } + + return "宸叉壒閲忕敓鎴愭娴嬮」锛岃鍒伴厤缃晫闈㈡煡鐪嬪拰淇濆瓨"; + }); + } + } +} diff --git a/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.resx b/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/src/Bro.M071.Process/UI/M071_PatchInsertMeasurement.resx @@ -0,0 +1,120 @@ +锘�<?xml version="1.0" encoding="utf-8"?> +<root> + <!-- + Microsoft ResX Schema + + Version 2.0 + + The primary goals of this format is to allow a simple XML format + that is mostly human readable. The generation and parsing of the + various data types are done through the TypeConverter classes + associated with the data types. + + Example: + + ... ado.net/XML headers & schema ... + <resheader name="resmimetype">text/microsoft-resx</resheader> + <resheader name="version">2.0</resheader> + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> + <value>[base64 mime encoded serialized .NET Framework object]</value> + </data> + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> + <comment>This is a comment</comment> + </data> + + There are any number of "resheader" rows that contain simple + name/value pairs. + + Each data row contains a name, and value. The row also contains a + type or mimetype. Type corresponds to a .NET class that support + text/value conversion through the TypeConverter architecture. + Classes that don't support this are serialized and stored with the + mimetype set. + + The mimetype is used for serialized objects, and tells the + ResXResourceReader how to depersist the object. This is currently not + extensible. For a given mimetype the value must be set accordingly: + + Note - application/x-microsoft.net.object.binary.base64 is the format + that the ResXResourceWriter will generate, however the reader can + read any of the formats listed below. + + mimetype: application/x-microsoft.net.object.binary.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.soap.base64 + value : The object must be serialized with + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter + : and then encoded with base64 encoding. + + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> + <xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> + <xsd:element name="root" msdata:IsDataSet="true"> + <xsd:complexType> + <xsd:choice maxOccurs="unbounded"> + <xsd:element name="metadata"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" /> + </xsd:sequence> + <xsd:attribute name="name" use="required" type="xsd:string" /> + <xsd:attribute name="type" type="xsd:string" /> + <xsd:attribute name="mimetype" type="xsd:string" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="assembly"> + <xsd:complexType> + <xsd:attribute name="alias" type="xsd:string" /> + <xsd:attribute name="name" type="xsd:string" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="data"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> + <xsd:attribute ref="xml:space" /> + </xsd:complexType> + </xsd:element> + <xsd:element name="resheader"> + <xsd:complexType> + <xsd:sequence> + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> + </xsd:sequence> + <xsd:attribute name="name" type="xsd:string" use="required" /> + </xsd:complexType> + </xsd:element> + </xsd:choice> + </xsd:complexType> + </xsd:element> + </xsd:schema> + <resheader name="resmimetype"> + <value>text/microsoft-resx</value> + </resheader> + <resheader name="version"> + <value>2.0</value> + </resheader> + <resheader name="reader"> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> + <resheader name="writer"> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + </resheader> +</root> \ No newline at end of file diff --git a/src/Bro.UI.Model.Winform/CommonHelper.cs b/src/Bro.UI.Model.Winform/CommonHelper.cs index ad96dbc..386a179 100644 --- a/src/Bro.UI.Model.Winform/CommonHelper.cs +++ b/src/Bro.UI.Model.Winform/CommonHelper.cs @@ -60,7 +60,12 @@ /// 1st MouseState 鍒濆鐘舵�� /// 2nd MouseState 鍙樺寲鐘舵�� /// </summary> - public static Action<ElementBase, ElementState, ElementState> ChangeElementsMouseState; + public static event Action<ElementBase, ElementState, ElementState> ChangeElementsMouseState; + + public static void TriggerElementsMouseStateChanged(ElementBase ele, ElementState preState, ElementState curState) + { + ChangeElementsMouseState?.Invoke(ele, preState, curState); + } } public class NoticedPoints : List<Point> diff --git a/src/Bro.UI.Model.Winform/ElementBase.cs b/src/Bro.UI.Model.Winform/ElementBase.cs index c0feb9d..669a378 100644 --- a/src/Bro.UI.Model.Winform/ElementBase.cs +++ b/src/Bro.UI.Model.Winform/ElementBase.cs @@ -191,7 +191,7 @@ { ElementState preState = state; Set(ref state, value); - EventRouter.ChangeElementsMouseState?.Invoke(this, preState, state); + EventRouter.TriggerElementsMouseStateChanged(this, preState, state); switch (state) { case ElementState.MouseHover: diff --git a/src/Bro.UI.Model.Winform/UI/CanvasImage.cs b/src/Bro.UI.Model.Winform/UI/CanvasImage.cs index 3bd6941..76beeac 100644 --- a/src/Bro.UI.Model.Winform/UI/CanvasImage.cs +++ b/src/Bro.UI.Model.Winform/UI/CanvasImage.cs @@ -31,7 +31,8 @@ MouseMove += Canvas_MouseMove; MouseUp += Canvas_MouseUp; - EventRouter.ChangeElementsMouseState = OnElementChangeMouseState; + EventRouter.ChangeElementsMouseState -= OnElementChangeMouseState; + EventRouter.ChangeElementsMouseState += OnElementChangeMouseState; } #region Event -- Gitblit v1.8.0