.NET  Smobiler的复杂控件的由来与创造

 更新时间:2022年08月09日 10:08:03   作者:smobiler  
这篇文章主要介绍了.NET Smobiler的复杂控件的由来与创造,Smobiler的复杂控件即利用自定义控件的方式组合控件,来使控件成为一个有机整体,里面的控件可相互协作交互,并使其达到高可用

存在意义

Smobiler的复杂控件即利用自定义控件的方式组合控件,来使控件成为一个有机整体,里面的控件可相互协作交互,并使其达到高可用。

在Smobiler中有许多基础控件,TextBox文本输入框控件可以调用输入法在界面上自由输入文字,Image图片显示控件可以在界面的任意位置显示图片,Label文本显示控件可以在界面的任意位置显示文本,Panel容器控件可存放其他控件。这些控件都是单独的功能,而我们设计界面不可能只有使用一个控件,这时我们就需要组合相同与不同的控件来为我们服务。比如需要一个可显示图片并且图片下方有文字注释,并且当点击图片时可触发点击事件来跳转另一个详细的介绍界面,此时就需要使用Panel、Image、Label这些基础的控件来组合使用。

那么问题来了,当我同一个界面需要多次使用上面的Image组合控件,我是否需要一次又一次的手动组合控件呢?那我整个项目中不同的界面中又需要无数次的使用上面的Image组合控件,是否需要做无数次的相同工作?答案是:并不需要!Smobiler中有自定义控件的功能,顾名思义自定义控件就是用户可根据自己的需要定制自己的控件,自定义的控件可在工具箱中显示。

当你在界面中需要运用多个相同的或者不同的控件,组合成一个各个控件相互关联的大整体,并且实现了高复用。你可以设计方法,设计属性,设计回调事件,使用这些随心所欲控制自己定制的复杂控件。

可实现的场景

复杂控件即可满足多种多样复杂场景。

下面以一部分Smobiler官方推出的复杂控件为例:

AlbumView控件 —— 相册控件,可设置缩略图点击后查看原图。用户可使用该控件展示图片。AlbumView控件主要由Panel、Image、PageView、Button、FontIcon基础控件组合而成。

ImageButton控件 —— 含图片的按钮控件,可点击图片触发点击事件。
ImageButton控件主要由Panel、Image、Label基础控件组合而成。

ListMenuView控件 —— 列表菜单控件,可快速显示列表信息。
ListMenuView控件主要由Panel、Label、ImageButton、ImageEx组成。

Numeric控件 —— 数量控件。即可输入数量,又可以点击按钮增加或减少数量。Numeric控件主要由TextBox、FontIcon组成。

Poplist控件 —— 弹出列表选择控件,可在选择在界面弹出选择框选择相应的信息。Poplist控件主要由Panel、Label、FontIcon、Button组成。

Radiogroup控件 —— 选择控件,同样功能不同样式的选择控件。RadioGroup控件主要由CheckBox、Label组成。

RatingBar控件 —— 评价控件,评分条控件可进行评价打分。RatingBar控件主要由Panel、FontIcon组成

TableView控件 —— 表格控件,可以表格的样式显示信息。TableView控件主要由Panel、Button、Image、CheckBox、Label、TextBox组成。

ToolBar控件 —— 工具栏控件,此控件可应用于底部点击显示不同的界面。ToolBar控件主要由Panel、ImageEx、Label组成。

施展创造

样式

下面我们就仿照Numeric控件的样式不使用设计器以纯代码的方式做一个复杂控件。
首先我们创建一个新的类取名为Numeric,如下图:

之后代码中取名为数量控件。

/// <summary>
/// 数量控件
/// </summary>
//下面代码可使控件显示在工具箱中。
[System.ComponentModel.ToolboxItem(true), System.ComponentModel.ToolboxItemFilter("Smobiler.Core.Controls")]
//取名,继承MobileLayoutControl布局控件、IMobileBindableControl数据绑定控件接口
public class Numeric : MobileLayoutControl, IMobileBindableControl
{   }

接下来我们就需要设计显示Numeric了。Numeric控件时由Panel、FontIcon、TextBox组成,先创建下列控件。

    //Numeric中间的输入框
    private TextBox txtValue;
    //Numeric左边的减少的图标
    private FontIcon fontMinus;
    //Numeric右边的增加的图标
    private FontIcon fontPlus;
    //使左边图标可点击
    private Panel Minus;
    //使右边图标可点击
    private Panel Plus;

主要控件创建完毕后,就需要设计这个基础控件的显示样式了。

    /// <summary>
    /// 初始化Numeric类的一个新实例
    /// </summary>
    public Numeric()
    {
        //本界面使用相对布局的方式,可按照自己顺手方式。
        this.Layout = LayoutPosition.Relative;
        //最外层添加一个Panel装所有的控件。
        Panel NPanel = new Panel();
        NPanel.Layout = LayoutPosition.Relative;
        //numeric需要横向排列设置容器主轴方向为Row。
        NPanel.Direction = LayoutDirection.Row;
        //在相对布局下使用Flex属性撑满界面
        NPanel.Flex = 1;
        NPanel.Width = 0;

        //设计左边可点击的Panel样式
        Minus = new Panel();
        Minus.Touchable = true;
        Minus.Layout = LayoutPosition.Relative;
        Minus.Flex = 1;
        Minus.Height = 0;
        Minus.Padding = new Padding(5, 0, 0, 0);
         Minus.BackColor = System.Drawing.Color.Transparent;

       //设计左边的减少的图标的样式
       fontMinus = new FontIcon
        {
            FontName = FontIconName.FontAwesome,
            ResourceID = "minus-circle",
            ForeColor = System.Drawing.Color.DarkGray,
            Width = 0,
            Flex = 1
        };
       //设计完样式之后把图标放入Panel容器中,即右边点击图标部分即完成了。
       Minus.Controls.Add(fontMinus);

     //以同样的方式设计右边的点击图标。
     .......
     .......
     Plus.Controls.Add(fontPlus);

     //设计中间的TextBox的样式。
     txtValue = new TextBox();
     txtValue.Text = mValue.ToString();
     //相对布局中设置txtValue的Flex为3,则对比Minus与Plus的1,表示txtValue为同一容器中大小占据3的份额,Minus与Plus个占据1.
     txtValue.Flex = 3;
     txtValue.Height = 0;
     txtValue.FontSize = 18;
     txtValue.KeyboardType = KeyboardType.Numeric;
     txtValue.HorizontalAlignment = HorizontalAlignment.Center;
     txtValue.BackColor = System.Drawing.Color.Transparent;

     //所有的样式都设计完了,这时就可以组合在一起了。
     NPanel.Controls.AddRange(new MobileControl[] { Minus, txtValue, Plus });
        //自定义控件需要添加在SmobilerUserControl。
        var mControls = new MobileControlCollection();
        //注册控件的集合
        base.RegisterControls(mControls);
        mControls.Add(NPanel);
    }

内部功能

此时与Numeric相同的样式即实现了。但是相同的样式并不能满足需求,我们还需要实现里面的逻辑,使之成为有功能的Numeric。

实现panel中的点击事件:

        Minus.Press += (obj, args) =>
        {
            if (string.IsNullOrEmpty(txtValue.Text.Trim()) == false)
            {
                decimal inputValue = 0;
                if (decimal.TryParse(txtValue.Text, out inputValue) == true)
                {
                    Value = inputValue - Variation;
                    initValue = Value;
                }
                else
                {
                    Value = Value;
                }
            }
            else{
                Value = mMinValue;
            }
        };

实现txtValue原本的事件:

 txtValue.TextChanged += (obj, args) =>
        {
         ......
        };
 txtValue.TouchEnter += (obj, args) =>
        {
         ......  
        };
        txtValue.TouchLeave += (obj, args) =>
        {
         ......    
        };

属性

添加Numeric的属性Value,可通过属性设置显示的值。

    private decimal mValue = 0;
    /// <summary>
    /// 设置控件显示的默认值
    /// </summary>
    [Browsable(true), Category("Behavior"), DefaultValue(typeof(decimal), "0"), Description("显示默认值")]
    public decimal Value
    {
        get
        {
            return mValue;
        }
        set
        {
            //添加判断
            value = (decimal)Math.Round(value, mDecimals);

            if (this.Parent != null && this.Parent.Controls.Contains(this) == true && (value > mMaxValue))
                value = MaxValue;
            else if (this.Parent != null && this.Parent.Controls.Contains(this) == true && (value < mMinValue))
                value = MinValue;
            if (initValue==value)
            {
                TextChanged = false;
                mValue = value;
            }
           else if (mValue != value||TextChanged==true)
            {
                TextChanged = false;
                mValue = value;
                //if (ValueChanged != null)
                //ValueChanged.Invoke(this, new EventArgs());
            }
            //给txtValue赋值显示。
            txtValue.Text = mValue.ToString("f" + Decimals);
        }
    }

方法

可以上面的方式添加不同的属性。

也可添加控件的方法:

    /// <summary>
    /// 使控件获取焦点。
    /// </summary>
    public void Focus()
    {
        txtValue.Focus();
    }
    /// <summary>
    /// 使控件失去焦点。
    /// </summary>
    public void Blur()
    {
        txtValue.Blur();
    }

绑定的属性

另外可实现绑定的属性,即可使用绑定的方式赋值

    private string mDisplayMember = "";
    /// <summary>
    /// 获取和设置显示绑定字段。
    /// </summary>
    [Browsable(true), Category("Data"), Description("显示绑定字段"), DefaultValue("")]
    public string DisplayMember { get { return mDisplayMember; } set { mDisplayMember = value; } }
     .......
   [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public object BindDisplayValue
    {
        get
        {
            return Value;
        }
        set
        {
            if (value != null)
            {
                this.Value = decimal.Parse(value.ToString());
            }
        }
    }

这样一个大致的Numeric的样式与功能有已实现完毕,重新生成项目即可在工具箱中找到它了。

知识拓展

控件中还可以添加事件,当达到某些条件时触发。
以Numeric中为例添加值改变时发生的事件。

    /// <summary>
    /// 值改变时发生
    /// </summary>
    [Description("值改变时发生")]
    public event EventHandler ValueChanged;

并且在Value值改动时使用该事件。

 if (ValueChanged != null) ValueChanged.Invoke(this, new EventArgs());

结语

Smobiler的复杂控件既丰富Smobiler的控件,又可让用户根据自己的需要定制自己的控件提高了UI的多样性,丰富用户使用场景,其高可用又大大节约了用户的开发时间。

到此这篇关于.NET  Smobiler的复杂控件的由来与创造的文章就介绍到这了,更多相关.NET Smobiler复杂控件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在 ASP.NET Core 中为 gRPC 服务添加全局异常处理

    在 ASP.NET Core 中为 gRPC 服务添加全局异常处理

    这篇文章主要介绍了在 ASP.NET Core 中为 gRPC 服务添加全局异常处理 ,在 ASP.NET Core 中使用 GRPC.ASPNETCore 工具包写 gRPC 服务,想实现 gRPC 的异常全局拦截,下面一起来看看文中的详细内容吧
    2022-01-01
  • asp.net创建事务的方法

    asp.net创建事务的方法

    本篇文章主要对asp.net创建事务的方法进行实例介绍,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • ASP.NET的Core AD域登录过程示例

    ASP.NET的Core AD域登录过程示例

    这篇文章主要为大家介绍了ASP.NET Core AD域登录过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 简单实现.NET Hook与事件模拟实例

    简单实现.NET Hook与事件模拟实例

    这篇文章主要为大家介绍了简单实现.NET Hook与事件模拟实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • .Net Framework .Net  .NET Standard的概念及区别

    .Net Framework .Net .NET Standard的概念及区别

    这篇文章主要介绍了.Net Framework .Net .NET Standard的概念及区别,需要的朋友可以参考下
    2021-08-08
  • .Net Core 之AutoFac的使用

    .Net Core 之AutoFac的使用

    本文简单介绍了AutoFac的基本使用以及在asp .net core中的应用,文中通过代码讲解相关知识非常的详细,对大家的学习或工作都很有帮助,感兴趣的小伙伴可以参考一下这篇文章
    2021-09-09
  • ASP.NET Core 依赖注入详细

    ASP.NET Core 依赖注入详细

    这篇文章主要介绍ASP.NET Core 依赖注入,ASP.NET Core 应用在启动过程中会依赖各种组件提供服务,这些组件会以接口的形式标准化,这些组件就是我们所说的服务,ASP.NET Core框架建立在一个底层的依赖注入框架之上,它使用容器提供所需的服务,下面我们就来详细了解一下
    2021-10-10
  • ASP.NET通过Web.config实现验证账号密码是否正确进行登录

    ASP.NET通过Web.config实现验证账号密码是否正确进行登录

    本文是通过authentication(认证访问者) 和 authorization( 访问权限),来实现一个简单的判断用户账号密码是否正确,需要的朋友可以参考下
    2021-09-09
  • upload上传单张图片

    upload上传单张图片

    这篇文章主要介绍了upload上传单张图片的代码,需要的朋友可以参考下。
    2015-07-07
  • ASP.NET Web API教程 创建Admin视图详细介绍

    ASP.NET Web API教程 创建Admin视图详细介绍

    现在我们转入客户端,并添加一个能够使用从Admin控制器而来的数据的页面。通过给控制器发送AJAX请求的方式,该页面将允许用户创建、编辑,或删除产品
    2012-11-11

最新评论