lixiaojun
2024-11-29 0cc49afcb0da13470d36a4412767d38588682f62
新增水力属性视图控件
已修改3个文件
已添加4个文件
1165 ■■■■■ 文件已修改
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/08-working/XhsProjectSimulationWorkingPage.cs 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Core/04-property/ShowEditorInViewAttribute.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyViewCtrl.Designer.cs 304 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyViewCtrl.cs 533 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyViewCtrl.resx 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.Designer.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/08-working/XhsProjectSimulationWorkingPage.cs
@@ -167,10 +167,10 @@
        #region å±žæ€§æŽ§ä»¶
        //属性控件
        private XhsProjectSimulationPropertyCtrl _propertyCtrl = null;
        private HydroVisualPropertyViewCtrl _propertyCtrl = null;
        //获取属性控件
        private XhsProjectSimulationPropertyCtrl GetPropertyCtrl()
        private HydroVisualPropertyViewCtrl GetPropertyCtrl()
        {
            if (_hydroInfo == null)
            {
@@ -178,11 +178,11 @@
            }
            if (_propertyCtrl == null)
            {
                _propertyCtrl = new XhsProjectSimulationPropertyCtrl();
                _propertyCtrl = new HydroVisualPropertyViewCtrl();
                _propertyCtrl.Dock = DockStyle.Fill;
                _propertyCtrl.HydroViewEvent += (visual) =>
                _propertyCtrl.HydroViewEvent += (visualViewModel) =>
                {
                    SelectVisual(visual, eVisualSource.Property);
                    SelectVisual(GetVisual(visualViewModel), eVisualSource.Property);
                };
                _propertyCtrl.BlinkLinkNodeEvent += async (link, linkNodeCode) =>
                { //强调连接节点
@@ -221,38 +221,6 @@
                    await Task.Delay(5000);
                    await _bimfaceCtrl?.ClearBlinkComponents();
                };
                _propertyCtrl.PropertyValueChangedEvent += async (visual) =>
                {
                    if (visual == null)
                    {
                        return;
                    }
                    UpdateVisualListCtrl();
                    var gradingHelper = await GetGradingHelper();
                    gradingHelper.Set();
                };
                _propertyCtrl.MarkPropertyValueChangedEvent += async (visual) =>
                {
                    //标注属性发生改变
                    //判断当前是否有标注展示,若有则更新标注,最好是更新单个标注
                    var markHelper = await GetMarkHelper();
                    markHelper.Set(visual);
                };
                _propertyCtrl.GradingPropertyValueChangedEvent += async (visual) =>
                {
                    //分级属性发生改变
                    //判断当前是否有分级展示,若有则更新分级,最好是更新单个分级
                    var gradingHelper = await GetGradingHelper();
                    gradingHelper.Set(visual);
                };
                _propertyCtrl.FlowEffectPropertyValueChangedEvent += async (visual) =>
                {
                    //流向属性发生改变
                    //判断流向是否加载,如果加载则更新流向,最好是更新单个流向
                    var flowEffectHelper = await GetFlowEffectHelper();
                    flowEffectHelper.Set(visual);
                };
            }
            return _propertyCtrl;
        }
@@ -425,6 +393,23 @@
            return _visualListHelper;
        }
        //获取可见构件
        private Yw.Model.HydroVisualInfo GetVisual(string code)
        {
            if (string.IsNullOrEmpty(code))
            {
                return default;
            }
            var visualListHelper = GetVisualListHelper();
            return visualListHelper.GetVisual(code);
        }
        //获取可见构件
        private Yw.Model.HydroVisualInfo GetVisual(HydroVisualViewModel visualViewModel)
        {
            return GetVisual(visualViewModel?.Code);
        }
        #endregion
        #region è§†å›¾åˆ—表
WinFrmUI/Yw.WinFrmUI.Core/04-property/ShowEditorInViewAttribute.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
namespace Yw.WinFrmUI
{
    /// <summary>
    /// ç¡®å®šæ˜¯å¦å…è®¸åœ¨è§†å›¾ä¸­æ˜¾ç¤ºç¼–辑框
    /// </summary>
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
    public class ShowEditorInViewAttribute : Attribute
    {
        /// <summary>
        ///
        /// </summary>
        public ShowEditorInViewAttribute(bool showEditor)
        {
            this.ShowEditor = showEditor;
        }
        /// <summary>
        ///
        /// </summary>
        public bool ShowEditor { get; set; }
    }
}
WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyViewCtrl.Designer.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,304 @@
namespace Yw.WinFrmUI
{
    partial class HydroVisualPropertyViewCtrl
    {
        /// <summary>
        /// å¿…需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// æ¸…理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #region ç»„件设计器生成的代码
        /// <summary>
        /// è®¾è®¡å™¨æ”¯æŒæ‰€éœ€çš„æ–¹æ³• - ä¸è¦
        /// ä½¿ç”¨ä»£ç ç¼–辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            components = new Container();
            ComponentResourceManager resources = new ComponentResourceManager(typeof(HydroVisualPropertyViewCtrl));
            DevExpress.Utils.SuperToolTip superToolTip1 = new DevExpress.Utils.SuperToolTip();
            DevExpress.Utils.ToolTipItem toolTipItem1 = new DevExpress.Utils.ToolTipItem();
            DevExpress.Utils.SuperToolTip superToolTip2 = new DevExpress.Utils.SuperToolTip();
            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem1 = new DevExpress.Utils.ToolTipTitleItem();
            DevExpress.Utils.ToolTipItem toolTipItem2 = new DevExpress.Utils.ToolTipItem();
            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
            hydroVisualPropertyDescriptionCtrl1 = new HydroVisualPropertyDescriptionCtrl();
            propertyGridControl1 = new DevExpress.XtraVerticalGrid.PropertyGridControl();
            svgImg16 = new DevExpress.Utils.SvgImageCollection(components);
            layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
            layoutProperty = new DevExpress.XtraLayout.LayoutControlItem();
            layoutDescription = new DevExpress.XtraLayout.LayoutControlItem();
            splitterItem1 = new DevExpress.XtraLayout.SplitterItem();
            barManager1 = new DevExpress.XtraBars.BarManager(components);
            bar1 = new DevExpress.XtraBars.Bar();
            barBtnExpandAll = new DevExpress.XtraBars.BarButtonItem();
            barBtnCollpseAll = new DevExpress.XtraBars.BarButtonItem();
            barBtnView = new DevExpress.XtraBars.BarButtonItem();
            barBtnHelp = new DevExpress.XtraBars.BarButtonItem();
            barDockControlTop = new DevExpress.XtraBars.BarDockControl();
            barDockControlBottom = new DevExpress.XtraBars.BarDockControl();
            barDockControlLeft = new DevExpress.XtraBars.BarDockControl();
            barDockControlRight = new DevExpress.XtraBars.BarDockControl();
            ((ISupportInitialize)layoutControl1).BeginInit();
            layoutControl1.SuspendLayout();
            ((ISupportInitialize)propertyGridControl1).BeginInit();
            ((ISupportInitialize)svgImg16).BeginInit();
            ((ISupportInitialize)layoutControlGroup1).BeginInit();
            ((ISupportInitialize)layoutProperty).BeginInit();
            ((ISupportInitialize)layoutDescription).BeginInit();
            ((ISupportInitialize)splitterItem1).BeginInit();
            ((ISupportInitialize)barManager1).BeginInit();
            SuspendLayout();
            //
            // layoutControl1
            //
            layoutControl1.Controls.Add(hydroVisualPropertyDescriptionCtrl1);
            layoutControl1.Controls.Add(propertyGridControl1);
            layoutControl1.Dock = DockStyle.Fill;
            layoutControl1.Location = new Point(0, 28);
            layoutControl1.Name = "layoutControl1";
            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(567, 190, 714, 577);
            layoutControl1.Root = layoutControlGroup1;
            layoutControl1.Size = new Size(260, 602);
            layoutControl1.TabIndex = 0;
            layoutControl1.Text = "layoutControl1";
            //
            // hydroVisualPropertyDescriptionCtrl1
            //
            hydroVisualPropertyDescriptionCtrl1.Location = new Point(2, 502);
            hydroVisualPropertyDescriptionCtrl1.Name = "hydroVisualPropertyDescriptionCtrl1";
            hydroVisualPropertyDescriptionCtrl1.Size = new Size(256, 98);
            hydroVisualPropertyDescriptionCtrl1.TabIndex = 5;
            //
            // propertyGridControl1
            //
            propertyGridControl1.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
            propertyGridControl1.ImageList = svgImg16;
            propertyGridControl1.Location = new Point(2, 2);
            propertyGridControl1.Name = "propertyGridControl1";
            propertyGridControl1.OptionsBehavior.PropertySort = DevExpress.XtraVerticalGrid.PropertySort.NoSort;
            propertyGridControl1.OptionsView.AllowReadOnlyRowAppearance = DevExpress.Utils.DefaultBoolean.True;
            propertyGridControl1.OptionsView.ShowFocusedFrame = false;
            propertyGridControl1.OptionsView.ShowRootLevelIndent = false;
            propertyGridControl1.RecordWidth = 120;
            propertyGridControl1.RowHeaderWidth = 80;
            propertyGridControl1.Size = new Size(256, 490);
            propertyGridControl1.TabIndex = 4;
            propertyGridControl1.FocusedRowChanged += propertyGridControl1_FocusedRowChanged;
            propertyGridControl1.CustomRecordCellEdit += propertyGridControl1_CustomRecordCellEdit;
            propertyGridControl1.CustomDrawRowHeaderIndent += propertyGridControl1_CustomDrawRowHeaderIndent;
            propertyGridControl1.CustomDrawRowHeaderCell += propertyGridControl1_CustomDrawRowHeaderCell;
            propertyGridControl1.CustomDrawRowValueCell += propertyGridControl1_CustomDrawRowValueCell;
            propertyGridControl1.ShowingEditor += propertyGridControl1_ShowingEditor;
            propertyGridControl1.CellValueChanged += propertyGridControl1_CellValueChanged;
            //
            // svgImg16
            //
            svgImg16.Add("actions_forbid", "image://svgimages/icon builder/actions_forbid.svg");
            svgImg16.Add("editnames", "image://svgimages/dashboards/editnames.svg");
            //
            // layoutControlGroup1
            //
            layoutControlGroup1.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
            layoutControlGroup1.GroupBordersVisible = false;
            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutProperty, layoutDescription, splitterItem1 });
            layoutControlGroup1.Name = "Root";
            layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
            layoutControlGroup1.Size = new Size(260, 602);
            layoutControlGroup1.TextVisible = false;
            //
            // layoutProperty
            //
            layoutProperty.Control = propertyGridControl1;
            layoutProperty.Location = new Point(0, 0);
            layoutProperty.Name = "layoutProperty";
            layoutProperty.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 2, 0);
            layoutProperty.Size = new Size(260, 492);
            layoutProperty.TextSize = new Size(0, 0);
            layoutProperty.TextVisible = false;
            //
            // layoutDescription
            //
            layoutDescription.Control = hydroVisualPropertyDescriptionCtrl1;
            layoutDescription.Location = new Point(0, 502);
            layoutDescription.Name = "layoutDescription";
            layoutDescription.Padding = new DevExpress.XtraLayout.Utils.Padding(2, 2, 0, 2);
            layoutDescription.Size = new Size(260, 100);
            layoutDescription.TextSize = new Size(0, 0);
            layoutDescription.TextVisible = false;
            //
            // splitterItem1
            //
            splitterItem1.AllowHotTrack = true;
            splitterItem1.Location = new Point(0, 492);
            splitterItem1.Name = "splitterItem1";
            splitterItem1.Size = new Size(260, 10);
            //
            // barManager1
            //
            barManager1.Bars.AddRange(new DevExpress.XtraBars.Bar[] { bar1 });
            barManager1.DockControls.Add(barDockControlTop);
            barManager1.DockControls.Add(barDockControlBottom);
            barManager1.DockControls.Add(barDockControlLeft);
            barManager1.DockControls.Add(barDockControlRight);
            barManager1.Form = this;
            barManager1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { barBtnHelp, barBtnExpandAll, barBtnCollpseAll, barBtnView });
            barManager1.MaxItemId = 18;
            //
            // bar1
            //
            bar1.BarAppearance.Hovered.BorderColor = Color.FromArgb(0, 122, 204);
            bar1.BarAppearance.Hovered.Options.UseBorderColor = true;
            bar1.BarAppearance.Pressed.BorderColor = Color.FromArgb(0, 122, 204);
            bar1.BarAppearance.Pressed.Options.UseBorderColor = true;
            bar1.BarName = "Tools";
            bar1.CanDockStyle = DevExpress.XtraBars.BarCanDockStyle.Top;
            bar1.DockCol = 0;
            bar1.DockRow = 0;
            bar1.DockStyle = DevExpress.XtraBars.BarDockStyle.Top;
            bar1.FloatLocation = new Point(1899, 679);
            bar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barBtnExpandAll), new DevExpress.XtraBars.LinkPersistInfo(barBtnCollpseAll), new DevExpress.XtraBars.LinkPersistInfo(barBtnView), new DevExpress.XtraBars.LinkPersistInfo(barBtnHelp) });
            bar1.OptionsBar.AllowQuickCustomization = false;
            bar1.OptionsBar.DrawBorder = false;
            bar1.OptionsBar.RotateWhenVertical = false;
            bar1.OptionsBar.UseWholeRow = true;
            bar1.Text = "Tools";
            //
            // barBtnExpandAll
            //
            barBtnExpandAll.Caption = "全部展开";
            barBtnExpandAll.Id = 13;
            barBtnExpandAll.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnExpandAll.ImageOptions.SvgImage");
            barBtnExpandAll.ImageOptions.SvgImageSize = new Size(20, 20);
            barBtnExpandAll.Name = "barBtnExpandAll";
            barBtnExpandAll.ItemClick += barBtnExpandAll_ItemClick;
            //
            // barBtnCollpseAll
            //
            barBtnCollpseAll.Caption = "全部折叠";
            barBtnCollpseAll.Id = 14;
            barBtnCollpseAll.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCollpseAll.ImageOptions.SvgImage");
            barBtnCollpseAll.ImageOptions.SvgImageSize = new Size(20, 20);
            barBtnCollpseAll.Name = "barBtnCollpseAll";
            barBtnCollpseAll.ItemClick += barBtnCollpseAll_ItemClick;
            //
            // barBtnView
            //
            barBtnView.Id = 17;
            barBtnView.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnView.ImageOptions.SvgImage");
            barBtnView.Name = "barBtnView";
            toolTipItem1.Text = "查看";
            superToolTip1.Items.Add(toolTipItem1);
            barBtnView.SuperTip = superToolTip1;
            barBtnView.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
            barBtnView.ItemClick += barBtnView_ItemClick;
            //
            // barBtnHelp
            //
            barBtnHelp.Caption = "描述信息";
            barBtnHelp.Id = 2;
            barBtnHelp.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnHelp.ImageOptions.SvgImage");
            barBtnHelp.ImageOptions.SvgImageSize = new Size(20, 20);
            barBtnHelp.Name = "barBtnHelp";
            toolTipTitleItem1.Appearance.Image = (Image)resources.GetObject("resource.Image");
            toolTipTitleItem1.Appearance.Options.UseImage = true;
            toolTipTitleItem1.ImageOptions.Image = (Image)resources.GetObject("resource.Image1");
            toolTipItem2.LeftIndent = 6;
            toolTipItem2.Text = "描述信息";
            superToolTip2.Items.Add(toolTipTitleItem1);
            superToolTip2.Items.Add(toolTipItem2);
            barBtnHelp.SuperTip = superToolTip2;
            barBtnHelp.ItemClick += barBtnHelp_ItemClick;
            //
            // barDockControlTop
            //
            barDockControlTop.CausesValidation = false;
            barDockControlTop.Dock = DockStyle.Top;
            barDockControlTop.Location = new Point(0, 0);
            barDockControlTop.Manager = barManager1;
            barDockControlTop.Size = new Size(260, 28);
            //
            // barDockControlBottom
            //
            barDockControlBottom.CausesValidation = false;
            barDockControlBottom.Dock = DockStyle.Bottom;
            barDockControlBottom.Location = new Point(0, 630);
            barDockControlBottom.Manager = barManager1;
            barDockControlBottom.Size = new Size(260, 0);
            //
            // barDockControlLeft
            //
            barDockControlLeft.CausesValidation = false;
            barDockControlLeft.Dock = DockStyle.Left;
            barDockControlLeft.Location = new Point(0, 28);
            barDockControlLeft.Manager = barManager1;
            barDockControlLeft.Size = new Size(0, 602);
            //
            // barDockControlRight
            //
            barDockControlRight.CausesValidation = false;
            barDockControlRight.Dock = DockStyle.Right;
            barDockControlRight.Location = new Point(260, 28);
            barDockControlRight.Manager = barManager1;
            barDockControlRight.Size = new Size(0, 602);
            //
            // HydroVisualPropertyViewCtrl
            //
            AutoScaleDimensions = new SizeF(7F, 14F);
            AutoScaleMode = AutoScaleMode.Font;
            Controls.Add(layoutControl1);
            Controls.Add(barDockControlLeft);
            Controls.Add(barDockControlRight);
            Controls.Add(barDockControlBottom);
            Controls.Add(barDockControlTop);
            Name = "HydroVisualPropertyViewCtrl";
            Size = new Size(260, 630);
            ((ISupportInitialize)layoutControl1).EndInit();
            layoutControl1.ResumeLayout(false);
            ((ISupportInitialize)propertyGridControl1).EndInit();
            ((ISupportInitialize)svgImg16).EndInit();
            ((ISupportInitialize)layoutControlGroup1).EndInit();
            ((ISupportInitialize)layoutProperty).EndInit();
            ((ISupportInitialize)layoutDescription).EndInit();
            ((ISupportInitialize)splitterItem1).EndInit();
            ((ISupportInitialize)barManager1).EndInit();
            ResumeLayout(false);
            PerformLayout();
        }
        #endregion
        private DevExpress.XtraLayout.LayoutControl layoutControl1;
        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
        private DevExpress.XtraLayout.LayoutControlItem layoutProperty;
        private DevExpress.XtraBars.BarDockControl barDockControlTop;
        private DevExpress.XtraBars.BarDockControl barDockControlBottom;
        private DevExpress.XtraBars.BarDockControl barDockControlLeft;
        private DevExpress.XtraBars.BarDockControl barDockControlRight;
        private DevExpress.XtraLayout.SplitterItem splitterItem1;
        private DevExpress.XtraBars.BarManager barManager1;
        private DevExpress.XtraVerticalGrid.PropertyGridControl propertyGridControl1;
        private DevExpress.XtraBars.BarButtonItem barBtnHelp;
        private DevExpress.XtraBars.Bar bar1;
        private DevExpress.XtraBars.BarButtonItem barBtnExpandAll;
        private DevExpress.XtraBars.BarButtonItem barBtnCollpseAll;
        private DevExpress.Utils.SvgImageCollection svgImg16;
        private DevExpress.XtraBars.BarButtonItem barBtnView;
        private HydroVisualPropertyDescriptionCtrl hydroVisualPropertyDescriptionCtrl1;
        private DevExpress.XtraLayout.LayoutControlItem layoutDescription;
    }
}
WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyViewCtrl.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,533 @@
using DevExpress.XtraBars;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraLayout.Utils;
using DevExpress.XtraVerticalGrid.Events;
namespace Yw.WinFrmUI
{
    public partial class HydroVisualPropertyViewCtrl : XtraUserControl
    {
        public HydroVisualPropertyViewCtrl()
        {
            InitializeComponent();
            this.layoutControl1.SetupLayoutControl();
        }
        /// <summary>
        /// å¼ºè°ƒè¿žæŽ¥èŠ‚ç‚¹äº‹ä»¶
        /// ç¬¬ä¸€ä¸ªå‚数为本身Code
        /// ç¬¬äºŒä¸ªå‚数为连接节点Code
        /// </summary>
        public event Action<HydroLinkViewModel, string> BlinkLinkNodeEvent;
        /// <summary>
        /// æŸ¥çœ‹æž„件事件
        /// </summary>
        public event Action<HydroVisualViewModel> HydroViewEvent;
        /// <summary>
        /// ç»‘定对象
        /// </summary>
        public HydroVisualViewModel SelectedObject
        {
            get
            {
                var vm = this.propertyGridControl1.SelectedObject as HydroVisualViewModel;
                return vm;
            }
            set
            {
                this.barBtnView.Visibility = value == null ? BarItemVisibility.Never : BarItemVisibility.Always;
                this.propertyGridControl1.SelectedObject = value;
            }
        }
        /// <summary>
        /// é‡æ–°ä»Žæ•°æ®æºä¸­è¯»å–数据,外观恢复刚开始加载的样子
        /// </summary>
        public void UpdateData()
        {
            this.propertyGridControl1.UpdateData();
        }
        /// <summary>
        /// æ›´æ–°æ•°æ®ï¼Œæ ·å¼ä¸å˜
        /// </summary>
        public void UpdateRows()
        {
            this.propertyGridControl1.UpdateRows();
        }
        //获取行的视图对象
        private HydroVisualViewModel GetPropertyViewModel(DevExpress.XtraVerticalGrid.Rows.BaseRow row)
        {
            if (row == null)
            {
                return default;
            }
            if (row.Level <= 1)
            {
                return this.SelectedObject;
            }
            if (row.ParentRow == null)
            {
                return this.SelectedObject;
            }
            if (row.ParentRow.Properties.Value is HydroVisualViewModel)
            {
                return row.ParentRow.Properties.Value as HydroVisualViewModel;
            }
            return GetPropertyViewModel(row.ParentRow);
        }
        //设置描述控件的可见性
        private void SetDescriptionVisible(bool isVisible)
        {
            var visible = isVisible ? LayoutVisibility.Always : LayoutVisibility.Never;
            this.layoutDescription.Visibility = this.splitterItem1.Visibility = visible;
        }
        //自定义属性Header缩进
        private void propertyGridControl1_CustomDrawRowHeaderIndent(object sender, CustomDrawRowHeaderIndentEventArgs e)
        {
        }
        //自定义属性Header显示
        private void propertyGridControl1_CustomDrawRowHeaderCell(object sender, CustomDrawRowHeaderCellEventArgs e)
        {
            //字段名称
            var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
            if (string.IsNullOrEmpty(fieldName))
            {
                return;
            }
            //属性描述器
            var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
            if (descriptor != null)
            {
                //名称
                var displayNameAttri = (DisplayNameAttribute)descriptor.Attributes[typeof(DisplayNameAttribute)];
                if (displayNameAttri != null && !string.IsNullOrEmpty(displayNameAttri.DisplayName))
                {
                    e.Caption = displayNameAttri.DisplayName;
                }
            }
            //颜色
            var vm = GetPropertyViewModel(e.Row);
            if (vm != null)
            {
                var propStatus = vm.GetPropStatus(fieldName);
                if (propStatus != null)
                {
                    switch (propStatus.PropStatus)
                    {
                        case Yw.Hydro.ePropStatus.Error:
                            {
                                e.Appearance.ForeColor = Color.Red;
                            }
                            break;
                        case Yw.Hydro.ePropStatus.Normal:
                            {
                                e.Appearance.ForeColor = Color.Black;
                            }
                            break;
                        case Yw.Hydro.ePropStatus.Lack:
                            {
                                e.Appearance.ForeColor = Color.Green;
                            }
                            break;
                        case Yw.Hydro.ePropStatus.Abnormal:
                            {
                                e.Appearance.ForeColor = Color.Orange;
                            }
                            break;
                        default: break;
                    }
                }
            }
        }
        //自定义属性值显示
        private void propertyGridControl1_CustomDrawRowValueCell(object sender, CustomDrawRowValueCellEventArgs e)
        {
            //行字段名称
            var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
            if (string.IsNullOrEmpty(fieldName))
            {
                return;
            }
            //行类型全名称
            var fullTypeName = e.Row.Properties.RowType.FullName;
            if (fullTypeName == typeof(DateTime).FullName)
            {
                e.CellText = ((DateTime)e.Properties.Value).ToString("yyyy-MM-dd HH:mm:ss");
            }
            else
            {
                var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
                if (descriptor != null)
                {
                    var calcuPropAttri = (HydroCalcuProAttribute)descriptor.Attributes[typeof(HydroCalcuProAttribute)];
                    if (calcuPropAttri != null)
                    {
                        if (e.Properties.Value == null)
                        {
                            e.CellText = "尚未计算";
                            e.Appearance.ForeColor = Color.OrangeRed;
                        }
                    }
                    var displayUnitAttri = (DisplayUnitAttribute)descriptor.Attributes[typeof(DisplayUnitAttribute)];
                    if (displayUnitAttri != null)
                    {
                        if (e.Properties.Value != null)
                        {
                            e.CellText = e.Properties.Value.ToString() + " " + displayUnitAttri.Unit;
                        }
                    }
                }
            }
        }
        //属性编辑框的显示与取消
        private void propertyGridControl1_ShowingEditor(object sender, CancelEventArgs e)
        {
            var rowTypeFullName = this.propertyGridControl1.FocusedRow.Properties.RowType.FullName;
            var fieldName = this.propertyGridControl1.FocusedRow.Properties.FieldName.Split(new char[] { '.' }).Last();
            if (rowTypeFullName == typeof(Image).FullName)
            {
                e.Cancel = true;
                return;
            }
            var descriptor = this.propertyGridControl1.GetPropertyDescriptor(this.propertyGridControl1.FocusedRow);
            var showEditorInView = (ShowEditorInViewAttribute)descriptor.Attributes[typeof(ShowEditorInViewAttribute)];
            if (showEditorInView == null)
            {
                e.Cancel = true;
                return;
            }
            if (!showEditorInView.ShowEditor)
            {
                e.Cancel = true;
                return;
            }
        }
        //编辑框
        private void propertyGridControl1_CustomRecordCellEdit(object sender, GetCustomRowCellEditEventArgs e)
        {
            var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
            if (string.IsNullOrEmpty(fieldName))
            {
                return;
            }
            var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
            var rowTypeFullName = e.Row.Properties.RowType.FullName;
            var vm = GetPropertyViewModel(e.Row);
            if (vm == null)
            {
                return;
            }
            #region bool
            if (rowTypeFullName == typeof(bool).FullName)
            {
                var ckEdit = new RepositoryItemCheckEdit();
                ckEdit.CheckStyle = DevExpress.XtraEditors.Controls.CheckStyles.Standard;
                if (e.Row.Properties.ReadOnly == true)
                {
                    ckEdit.ReadOnly = true;
                }
                e.RepositoryItem = ckEdit;
            }
            #endregion
            #region å¯Œæ–‡æœ¬
            var attri_multi = (MultiTextAttribute)descriptor.Attributes[typeof(MultiTextAttribute)];
            if (attri_multi != null)
            {
                var memoEdit = new RepositoryItemMemoEdit();
                if (e.Row.Properties.ReadOnly == true)
                {
                    memoEdit.ReadOnly = true;
                }
                e.RepositoryItem = memoEdit;
            }
            #endregion
            #region å›¾ç‰‡
            if (rowTypeFullName == typeof(Image).FullName)
            {
                var picEdit = new RepositoryItemPictureEdit();
                picEdit.ReadOnly = true;
                picEdit.NullText = "空";
                e.RepositoryItem = picEdit;
                e.Row.Expanded = true;
            }
            #endregion
            #region æ›²çº¿
            var curvePropAttri = (HydroCurveProAttribute)descriptor.Attributes[typeof(HydroCurveProAttribute)];
            if (curvePropAttri != null)
            {
                var buttonEdit = new RepositoryItemButtonEdit();
                buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
                buttonEdit.ButtonClick += delegate
                {
                    var vm = GetPropertyViewModel(e.Row);
                    if (vm == null)
                    {
                        return;
                    }
                    switch (curvePropAttri.CurveType)
                    {
                        case HydroCurve.Tank:
                            {
                            }
                            break;
                        case HydroCurve.TankVol:
                            {
                            }
                            break;
                        case HydroCurve.Pump:
                            {
                            }
                            break;
                        case HydroCurve.PumpQH:
                            {
                            }
                            break;
                        case HydroCurve.PumpQP:
                            {
                                var pumpViewModel = vm as HydroPumpViewModel;
                                var curveQp = vm.HydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQP);
                                var dlg = new SetHydroCurveDlg();
                                dlg.ReloadDataEvent += (curveInfo) =>
                                {
                                    if (vm.HydroInfo.Curves == null)
                                    {
                                        vm.HydroInfo.Curves = new List<Model.HydroCurveInfo>();
                                    }
                                    if (curveQp != null)
                                    {
                                        vm.HydroInfo.Curves.Remove(curveQp);
                                    }
                                    vm.HydroInfo.Curves.Add(curveInfo);
                                    pumpViewModel.CurveQP = curveInfo.Code;
                                    UpdateRows();
                                };
                                dlg.SetBindingData(vm.HydroInfo, curveQp, curvePropAttri.CurveType);
                                dlg.ShowDialog();
                            }
                            break;
                        case HydroCurve.PumpQE:
                            {
                                var pumpViewModel = vm as HydroPumpViewModel;
                                var curveQe = vm.HydroInfo.Curves?.Find(x => x.Code == pumpViewModel.CurveQE);
                                var dlg = new SetHydroCurveDlg();
                                dlg.ReloadDataEvent += (curveInfo) =>
                                {
                                    if (vm.HydroInfo.Curves == null)
                                    {
                                        vm.HydroInfo.Curves = new List<Model.HydroCurveInfo>();
                                    }
                                    if (curveQe != null)
                                    {
                                        vm.HydroInfo.Curves.Remove(curveQe);
                                    }
                                    vm.HydroInfo.Curves.Add(curveInfo);
                                    pumpViewModel.CurveQE = curveInfo.Code;
                                    UpdateRows();
                                };
                                dlg.SetBindingData(vm.HydroInfo, curveQe, curvePropAttri.CurveType);
                                dlg.ShowDialog();
                            }
                            break;
                        case HydroCurve.Valve:
                            {
                            }
                            break;
                        case HydroCurve.ValveQL:
                            {
                            }
                            break;
                        default: break;
                    }
                };
                e.RepositoryItem = buttonEdit;
            }
            #endregion
            #region æ¨¡å¼
            var patternProAttri = (HydroPatternProAttribute)descriptor.Attributes[typeof(HydroPatternProAttribute)];
            if (patternProAttri != null)
            {
                var buttonEdit = new RepositoryItemButtonEdit();
                buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
                buttonEdit.ButtonClick += delegate
                {
                    var vm = GetPropertyViewModel(e.Row);
                    switch (patternProAttri.PatternType)
                    {
                        case HydroPattern.Head:
                            {
                            }
                            break;
                        case HydroPattern.Demand:
                            {
                            }
                            break;
                    }
                };
                e.RepositoryItem = buttonEdit;
            }
            #endregion
            #region è¿žæŽ¥
            if (e.Row.Properties.Value != null)
            {
                var linkCodeAttri = (HydroLinkProAttribute)descriptor.Attributes[typeof(HydroLinkProAttribute)];
                if (linkCodeAttri != null)
                {
                    var buttonEdit = new RepositoryItemButtonEdit();
                    buttonEdit.TextEditStyle = TextEditStyles.DisableTextEditor;
                    buttonEdit.ButtonClick += delegate
                    {
                        var vm = GetPropertyViewModel(e.Row);
                        var vmLink = vm as HydroLinkViewModel;
                        this.BlinkLinkNodeEvent?.Invoke(vmLink, e.Row.Properties.Value.ToString());
                    };
                    e.RepositoryItem = buttonEdit;
                }
            }
            #endregion
        }
        //属性值改变
        private void propertyGridControl1_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e)
        {
            //var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
            //if (string.IsNullOrEmpty(fieldName))
            //{
            //    return;
            //}
            //var vm = GetPropertyViewModel(e.Row);
            //if (vm == null)
            //{
            //    return;
            //}
            //vm.UpdateVmoProperty();
        }
        //全部展开
        private void barBtnExpandAll_ItemClick(object sender, ItemClickEventArgs e)
        {
            this.propertyGridControl1.ExpandAllRows();
        }
        //全部折叠
        private void barBtnCollpseAll_ItemClick(object sender, ItemClickEventArgs e)
        {
            this.propertyGridControl1.CollapseAllRows();
        }
        //查看
        private void barBtnView_ItemClick(object sender, ItemClickEventArgs e)
        {
            var vm = this.SelectedObject;
            if (vm == null)
            {
                return;
            }
            this.HydroViewEvent?.Invoke(vm);
        }
        // æè¿°
        private void barBtnHelp_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            var visible = this.splitterItem1.Visibility == LayoutVisibility.Always ? false : true;
            SetDescriptionVisible(visible);
        }
        //聚焦行改变
        private void propertyGridControl1_FocusedRowChanged(object sender, FocusedRowChangedEventArgs e)
        {
            if (e.Row == null)
            {
                return;
            }
            //字段名称
            var fieldName = e.Row.Properties.FieldName.Split(new char[] { '.' }).Last();
            if (string.IsNullOrEmpty(fieldName))
            {
                return;
            }
            var vm = GetPropertyViewModel(e.Row);
            if (vm == null)
            {
                return;
            }
            string caption = string.Empty;
            string descrition = string.Empty;
            //属性描述器
            var descriptor = this.propertyGridControl1.GetPropertyDescriptor(e.Row);
            if (descriptor != null)
            {
                //名称
                var displayNameAttri = (DisplayNameAttribute)descriptor.Attributes[typeof(DisplayNameAttribute)];
                if (displayNameAttri != null && !string.IsNullOrEmpty(displayNameAttri.DisplayName))
                {
                    caption = displayNameAttri.DisplayName;
                }
                //描述
                var descritionAttri = (DescriptionAttribute)descriptor.Attributes[typeof(DescriptionAttribute)];
                if (descritionAttri != null)
                {
                    descrition = descritionAttri.Description;
                }
            }
            var propStatus = vm.GetPropStatus(fieldName);
            this.hydroVisualPropertyDescriptionCtrl1.SetBindingData(caption, descrition, propStatus);
        }
    }
}
WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyViewCtrl.resx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,237 @@
<?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>
  <metadata name="svgImg16.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>152, 17</value>
  </metadata>
  <metadata name="barManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>17, 17</value>
  </metadata>
  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
  <data name="barBtnExpandAll.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALACAAAC77u/
        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
        Y2U9InByZXNlcnZlIiBpZD0iRXhwYW5kX0ZpZWxkIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3
        IDAgMCAzMiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuQmxhY2t7ZmlsbDojNzI3Mjcy
        O30KCS5HcmVlbntmaWxsOiMwMzlDMjM7fQoJLnN0MHtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8
        cG9seWdvbiBwb2ludHM9IjE0LDYgMTAsNiAxMCwyIDYsMiA2LDYgMiw2IDIsMTAgNiwxMCA2LDE0IDEw
        LDE0IDEwLDEwIDE0LDEwICIgY2xhc3M9IkdyZWVuIiAvPg0KICA8ZyBjbGFzcz0ic3QwIj4NCiAgICA8
        cGF0aCBkPSJNMjIsNmgxMHYySDIyVjZ6IE0yMiwxMmgxMHYtMkgyMlYxMnogTTIyLDIwaDEwdi0ySDIy
        VjIweiBNMjIsMjRoMTB2LTJIMjJWMjR6IiBjbGFzcz0iQmxhY2siIC8+DQogIDwvZz4NCiAgPHBhdGgg
        ZD0iTTE4LDJoMTR2MkgxOFYyeiBNMTgsMTZoMTR2LTJIMThWMTZ6IE0xOCwyOGgxNHYtMkgxOFYyOHoi
        IGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
</value>
  </data>
  <data name="barBtnCollpseAll.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAIcCAAAC77u/
        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
        Y2U9InByZXNlcnZlIiBpZD0iQ29sbGFwc2VfRmllbGQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpu
        ZXcgMCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5CbGFja3tmaWxsOiM3Mjcy
        NzI7fQoJLlJlZHtmaWxsOiNEMTFDMUM7fQoJLnN0MHtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8
        cmVjdCB4PSIyIiB5PSI2IiB3aWR0aD0iMTIiIGhlaWdodD0iNCIgY2xhc3M9IlJlZCIgLz4NCiAgPGcg
        Y2xhc3M9InN0MCI+DQogICAgPHBhdGggZD0iTTIyLDZoMTB2MkgyMlY2eiBNMjIsMTJoMTB2LTJIMjJW
        MTJ6IE0yMiwyMGgxMHYtMkgyMlYyMHogTTIyLDI0aDEwdi0ySDIyVjI0eiIgY2xhc3M9IkJsYWNrIiAv
        Pg0KICA8L2c+DQogIDxwYXRoIGQ9Ik0xOCwyaDE0djJIMThWMnogTTE4LDE2aDE0di0ySDE4VjE2eiBN
        MTgsMjhoMTR2LTJIMThWMjh6IiBjbGFzcz0iQmxhY2siIC8+DQo8L3N2Zz4L
</value>
  </data>
  <data name="barBtnView.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAADUCAAAC77u/
        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
        dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IlNlbmQiPg0KICAgIDxwb2x5Z29uIHBvaW50cz0iMiwy
        MCA4LDIyLjQgMjQsMTAgMTIsMjQgMTIsMzAgMTYuMywyNS43IDIyLDI4IDMwLDIgICIgY2xhc3M9IkJs
        dWUiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
</value>
  </data>
  <data name="barBtnHelp.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABsDAAAC77u/
        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
        MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
        Y2l0eTowLjU7fQoJLnN0MXtkaXNwbGF5Om5vbmU7fQoJLnN0MntkaXNwbGF5OmlubGluZTtmaWxsOiMw
        MzlDMjM7fQoJLnN0M3tkaXNwbGF5OmlubGluZTtmaWxsOiNEMTFDMUM7fQoJLnN0NHtkaXNwbGF5Omlu
        bGluZTtmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iQWJvdXQiPg0KICAgIDxwYXRoIGQ9
        Ik0xNiwyQzguMywyLDIsOC4zLDIsMTZzNi4zLDE0LDE0LDE0czE0LTYuMywxNC0xNFMyMy43LDIsMTYs
        MnogTTE2LDZjMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJzLTItMC45LTItMiAgIFMxNC45LDYsMTYs
        NnogTTIwLDI0aC04di0yaDJ2LThoLTJ2LTJoMmg0djEwaDJWMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAg
        PC9nPg0KPC9zdmc+Cw==
</value>
  </data>
  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  <data name="resource.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACR0RVh0VGl0
        bGUAQ29tbWVudDtUb29sdGlwO0hpbnQ7VGlwO0Nsb3Vk08HbyQAAAm9JREFUOE91k0lMU1EUhm8QJ6xY
        QIWlW4kL3GAoGIIaF7rRDQsFBUUKBLFaQIK0FlocVpo40DQyU1rKIIQhYNR0oVgtpWUSlCJpcGhNQMRo
        dPV77nsPUkBv8uX/z7nn/vct3mW0QohQYqPEJmKzxBZiKxEmsY2QSfC9EFbR4rEb2kZhaB2TGCGoto1A
        T17PtWUEFTYPaBblLW6UW90orXs5SAFhTGN2w7P0B57vIm6JYc6iiCuIIcL57TdKGpyggB2sqNYJFzXa
        ZxZFvBLB9Zq+/ctPqEyDPCCC5T14AUfgF5omFiTmBTWPB9fzUk2etN+3hAt37TwgiqXdfornvh8wDQeQ
        VeNC3JVOQVf7oRVvcgVge7uAVH0fD9jJUvUD6KTkW8/moCjpwdxnPw5d7/+vNzzxwTjox4mybh6wi53U
        9sLi/opr3bM4/dCBg5o+nDU5kW58LfgM7qtEn258g9LuD7hj/4RjxY95wG52vKQL1a/8KOzwQtszi8oB
        n6CcG3Sbtpc8UUleQ8rnKvt9OHK5lQdEs6PqDtyzf0SB9Z2IbWrFX1zRKcEv12VdM0jOt/KAGJZSYMNN
        urWYkovbvLjaMY0iUj6Y2zQpoGwUtcAyhcLWaaht76HIMYtfkJBVa0/KtSAppxmJHGUzEpRmpKgsUNZN
        4lzdBDGG7PpxJKusiD/fKLD/1H0HBcgJ4V8Pl4oIIpKICd+XaTysbkdm9SgyCEVOA7bHptfQ3h6+T/D5
        UKbT6dZBiz8wefSBS6bE/GbEZ9dDtjftEfWiiA2rZoOLYKSQSHmcskoWe8b4r8PC3NpGMPwAsfyU1x3W
        6XTsLy5SM69xQkG9AAAAAElFTkSuQmCC
</value>
  </data>
  <data name="resource.Image1" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACR0RVh0VGl0
        bGUAQ29tbWVudDtUb29sdGlwO0hpbnQ7VGlwO0Nsb3Vk08HbyQAAAm9JREFUOE91k0lMU1EUhm8QJ6xY
        QIWlW4kL3GAoGIIaF7rRDQsFBUUKBLFaQIK0FlocVpo40DQyU1rKIIQhYNR0oVgtpWUSlCJpcGhNQMRo
        dPV77nsPUkBv8uX/z7nn/vct3mW0QohQYqPEJmKzxBZiKxEmsY2QSfC9EFbR4rEb2kZhaB2TGCGoto1A
        T17PtWUEFTYPaBblLW6UW90orXs5SAFhTGN2w7P0B57vIm6JYc6iiCuIIcL57TdKGpyggB2sqNYJFzXa
        ZxZFvBLB9Zq+/ctPqEyDPCCC5T14AUfgF5omFiTmBTWPB9fzUk2etN+3hAt37TwgiqXdfornvh8wDQeQ
        VeNC3JVOQVf7oRVvcgVge7uAVH0fD9jJUvUD6KTkW8/moCjpwdxnPw5d7/+vNzzxwTjox4mybh6wi53U
        9sLi/opr3bM4/dCBg5o+nDU5kW58LfgM7qtEn258g9LuD7hj/4RjxY95wG52vKQL1a/8KOzwQtszi8oB
        n6CcG3Sbtpc8UUleQ8rnKvt9OHK5lQdEs6PqDtyzf0SB9Z2IbWrFX1zRKcEv12VdM0jOt/KAGJZSYMNN
        urWYkovbvLjaMY0iUj6Y2zQpoGwUtcAyhcLWaaht76HIMYtfkJBVa0/KtSAppxmJHGUzEpRmpKgsUNZN
        4lzdBDGG7PpxJKusiD/fKLD/1H0HBcgJ4V8Pl4oIIpKICd+XaTysbkdm9SgyCEVOA7bHptfQ3h6+T/D5
        UKbT6dZBiz8wefSBS6bE/GbEZ9dDtjftEfWiiA2rZoOLYKSQSHmcskoWe8b4r8PC3NpGMPwAsfyU1x3W
        6XTsLy5SM69xQkG9AAAAAElFTkSuQmCC
</value>
  </data>
</root>
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.Designer.cs
@@ -73,6 +73,8 @@
            xyDiagram1.AxisY.MinorCount = 1;
            xyDiagram1.AxisY.Tickmarks.MinorVisible = false;
            xyDiagram1.AxisY.VisibleInPanesSerializable = "-1";
            xyDiagram1.EnableAxisXScrolling = true;
            xyDiagram1.EnableAxisXZooming = true;
            secondaryAxisy1.AxisID = 0;
            secondaryAxisy1.Color = Color.FromArgb(79, 129, 189);
            secondaryAxisy1.MinorCount = 1;
@@ -118,12 +120,12 @@
            chartControl1.Size = new Size(848, 569);
            chartControl1.TabIndex = 0;
            // 
            // HydroSingleLossCurveCtrl
            // HydroSingleWorkingLossCurveCtrl
            // 
            AutoScaleDimensions = new SizeF(7F, 14F);
            AutoScaleMode = AutoScaleMode.Font;
            Controls.Add(chartControl1);
            Name = "HydroSingleLossCurveCtrl";
            Name = "HydroSingleWorkingLossCurveCtrl";
            Size = new Size(848, 569);
            ((ISupportInitialize)lossBindingSource).EndInit();
            ((ISupportInitialize)elevBindingSource).EndInit();
WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
@@ -68,6 +68,9 @@
        <Compile Update="04-viewmodel\07-curve\02-set\SetHydroCurveDlg.cs">
          <SubType>Form</SubType>
        </Compile>
        <Compile Update="05-property\HydroVisualPropertyViewCtrl.cs">
          <SubType>UserControl</SubType>
        </Compile>
        <Compile Update="05-property\HydroVisualPropertyCtrl.cs">
            <SubType>UserControl</SubType>
        </Compile>