最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET??Smobiler的復(fù)雜控件的由來與創(chuàng)造

 更新時(shí)間:2022年08月09日 10:08:03   作者:smobiler  
這篇文章主要介紹了.NET Smobiler的復(fù)雜控件的由來與創(chuàng)造,Smobiler的復(fù)雜控件即利用自定義控件的方式組合控件,來使控件成為一個(gè)有機(jī)整體,里面的控件可相互協(xié)作交互,并使其達(dá)到高可用

存在意義

Smobiler的復(fù)雜控件即利用自定義控件的方式組合控件,來使控件成為一個(gè)有機(jī)整體,里面的控件可相互協(xié)作交互,并使其達(dá)到高可用。

在Smobiler中有許多基礎(chǔ)控件,TextBox文本輸入框控件可以調(diào)用輸入法在界面上自由輸入文字,Image圖片顯示控件可以在界面的任意位置顯示圖片,Label文本顯示控件可以在界面的任意位置顯示文本,Panel容器控件可存放其他控件。這些控件都是單獨(dú)的功能,而我們?cè)O(shè)計(jì)界面不可能只有使用一個(gè)控件,這時(shí)我們就需要組合相同與不同的控件來為我們服務(wù)。比如需要一個(gè)可顯示圖片并且圖片下方有文字注釋,并且當(dāng)點(diǎn)擊圖片時(shí)可觸發(fā)點(diǎn)擊事件來跳轉(zhuǎn)另一個(gè)詳細(xì)的介紹界面,此時(shí)就需要使用Panel、Image、Label這些基礎(chǔ)的控件來組合使用。

那么問題來了,當(dāng)我同一個(gè)界面需要多次使用上面的Image組合控件,我是否需要一次又一次的手動(dòng)組合控件呢?那我整個(gè)項(xiàng)目中不同的界面中又需要無數(shù)次的使用上面的Image組合控件,是否需要做無數(shù)次的相同工作?答案是:并不需要!Smobiler中有自定義控件的功能,顧名思義自定義控件就是用戶可根據(jù)自己的需要定制自己的控件,自定義的控件可在工具箱中顯示。

當(dāng)你在界面中需要運(yùn)用多個(gè)相同的或者不同的控件,組合成一個(gè)各個(gè)控件相互關(guān)聯(lián)的大整體,并且實(shí)現(xiàn)了高復(fù)用。你可以設(shè)計(jì)方法,設(shè)計(jì)屬性,設(shè)計(jì)回調(diào)事件,使用這些隨心所欲控制自己定制的復(fù)雜控件。

可實(shí)現(xiàn)的場(chǎng)景

復(fù)雜控件即可滿足多種多樣復(fù)雜場(chǎng)景。

下面以一部分Smobiler官方推出的復(fù)雜控件為例:

AlbumView控件 —— 相冊(cè)控件,可設(shè)置縮略圖點(diǎn)擊后查看原圖。用戶可使用該控件展示圖片。AlbumView控件主要由Panel、Image、PageView、Button、FontIcon基礎(chǔ)控件組合而成。

ImageButton控件 —— 含圖片的按鈕控件,可點(diǎn)擊圖片觸發(fā)點(diǎn)擊事件。
ImageButton控件主要由Panel、Image、Label基礎(chǔ)控件組合而成。

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

Numeric控件 —— 數(shù)量控件。即可輸入數(shù)量,又可以點(diǎn)擊按鈕增加或減少數(shù)量。Numeric控件主要由TextBox、FontIcon組成。

Poplist控件 —— 彈出列表選擇控件,可在選擇在界面彈出選擇框選擇相應(yīng)的信息。Poplist控件主要由Panel、Label、FontIcon、Button組成。

Radiogroup控件 —— 選擇控件,同樣功能不同樣式的選擇控件。RadioGroup控件主要由CheckBox、Label組成。

RatingBar控件 —— 評(píng)價(jià)控件,評(píng)分條控件可進(jìn)行評(píng)價(jià)打分。RatingBar控件主要由Panel、FontIcon組成

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

ToolBar控件 —— 工具欄控件,此控件可應(yīng)用于底部點(diǎn)擊顯示不同的界面。ToolBar控件主要由Panel、ImageEx、Label組成。

施展創(chuàng)造

樣式

下面我們就仿照Numeric控件的樣式不使用設(shè)計(jì)器以純代碼的方式做一個(gè)復(fù)雜控件。
首先我們創(chuàng)建一個(gè)新的類取名為Numeric,如下圖:

之后代碼中取名為數(shù)量控件。

/// <summary>
/// 數(shù)量控件
/// </summary>
//下面代碼可使控件顯示在工具箱中。
[System.ComponentModel.ToolboxItem(true), System.ComponentModel.ToolboxItemFilter("Smobiler.Core.Controls")]
//取名,繼承MobileLayoutControl布局控件、IMobileBindableControl數(shù)據(jù)綁定控件接口
public class Numeric : MobileLayoutControl, IMobileBindableControl
{   }

接下來我們就需要設(shè)計(jì)顯示Numeric了。Numeric控件時(shí)由Panel、FontIcon、TextBox組成,先創(chuàng)建下列控件。

    //Numeric中間的輸入框
    private TextBox txtValue;
    //Numeric左邊的減少的圖標(biāo)
    private FontIcon fontMinus;
    //Numeric右邊的增加的圖標(biāo)
    private FontIcon fontPlus;
    //使左邊圖標(biāo)可點(diǎn)擊
    private Panel Minus;
    //使右邊圖標(biāo)可點(diǎn)擊
    private Panel Plus;

主要控件創(chuàng)建完畢后,就需要設(shè)計(jì)這個(gè)基礎(chǔ)控件的顯示樣式了。

    /// <summary>
    /// 初始化Numeric類的一個(gè)新實(shí)例
    /// </summary>
    public Numeric()
    {
        //本界面使用相對(duì)布局的方式,可按照自己順手方式。
        this.Layout = LayoutPosition.Relative;
        //最外層添加一個(gè)Panel裝所有的控件。
        Panel NPanel = new Panel();
        NPanel.Layout = LayoutPosition.Relative;
        //numeric需要橫向排列設(shè)置容器主軸方向?yàn)镽ow。
        NPanel.Direction = LayoutDirection.Row;
        //在相對(duì)布局下使用Flex屬性撐滿界面
        NPanel.Flex = 1;
        NPanel.Width = 0;

        //設(shè)計(jì)左邊可點(diǎn)擊的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;

       //設(shè)計(jì)左邊的減少的圖標(biāo)的樣式
       fontMinus = new FontIcon
        {
            FontName = FontIconName.FontAwesome,
            ResourceID = "minus-circle",
            ForeColor = System.Drawing.Color.DarkGray,
            Width = 0,
            Flex = 1
        };
       //設(shè)計(jì)完樣式之后把圖標(biāo)放入Panel容器中,即右邊點(diǎn)擊圖標(biāo)部分即完成了。
       Minus.Controls.Add(fontMinus);

     //以同樣的方式設(shè)計(jì)右邊的點(diǎn)擊圖標(biāo)。
     .......
     .......
     Plus.Controls.Add(fontPlus);

     //設(shè)計(jì)中間的TextBox的樣式。
     txtValue = new TextBox();
     txtValue.Text = mValue.ToString();
     //相對(duì)布局中設(shè)置txtValue的Flex為3,則對(duì)比Minus與Plus的1,表示txtValue為同一容器中大小占據(jù)3的份額,Minus與Plus個(gè)占據(jù)1.
     txtValue.Flex = 3;
     txtValue.Height = 0;
     txtValue.FontSize = 18;
     txtValue.KeyboardType = KeyboardType.Numeric;
     txtValue.HorizontalAlignment = HorizontalAlignment.Center;
     txtValue.BackColor = System.Drawing.Color.Transparent;

     //所有的樣式都設(shè)計(jì)完了,這時(shí)就可以組合在一起了。
     NPanel.Controls.AddRange(new MobileControl[] { Minus, txtValue, Plus });
        //自定義控件需要添加在SmobilerUserControl。
        var mControls = new MobileControlCollection();
        //注冊(cè)控件的集合
        base.RegisterControls(mControls);
        mControls.Add(NPanel);
    }

內(nèi)部功能

此時(shí)與Numeric相同的樣式即實(shí)現(xiàn)了。但是相同的樣式并不能滿足需求,我們還需要實(shí)現(xiàn)里面的邏輯,使之成為有功能的Numeric。

實(shí)現(xiàn)panel中的點(diǎn)擊事件:

        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;
            }
        };

實(shí)現(xiàn)txtValue原本的事件:

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

屬性

添加Numeric的屬性Value,可通過屬性設(shè)置顯示的值。

    private decimal mValue = 0;
    /// <summary>
    /// 設(shè)置控件顯示的默認(rèn)值
    /// </summary>
    [Browsable(true), Category("Behavior"), DefaultValue(typeof(decimal), "0"), Description("顯示默認(rèn)值")]
    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>
    /// 使控件獲取焦點(diǎn)。
    /// </summary>
    public void Focus()
    {
        txtValue.Focus();
    }
    /// <summary>
    /// 使控件失去焦點(diǎn)。
    /// </summary>
    public void Blur()
    {
        txtValue.Blur();
    }

綁定的屬性

另外可實(shí)現(xiàn)綁定的屬性,即可使用綁定的方式賦值

    private string mDisplayMember = "";
    /// <summary>
    /// 獲取和設(shè)置顯示綁定字段。
    /// </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());
            }
        }
    }

這樣一個(gè)大致的Numeric的樣式與功能有已實(shí)現(xiàn)完畢,重新生成項(xiàng)目即可在工具箱中找到它了。

知識(shí)拓展

控件中還可以添加事件,當(dāng)達(dá)到某些條件時(shí)觸發(fā)。
以Numeric中為例添加值改變時(shí)發(fā)生的事件。

    /// <summary>
    /// 值改變時(shí)發(fā)生
    /// </summary>
    [Description("值改變時(shí)發(fā)生")]
    public event EventHandler ValueChanged;

并且在Value值改動(dòng)時(shí)使用該事件。

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

結(jié)語

Smobiler的復(fù)雜控件既豐富Smobiler的控件,又可讓用戶根據(jù)自己的需要定制自己的控件提高了UI的多樣性,豐富用戶使用場(chǎng)景,其高可用又大大節(jié)約了用戶的開發(fā)時(shí)間。

到此這篇關(guān)于.NET  Smobiler的復(fù)雜控件的由來與創(chuàng)造的文章就介紹到這了,更多相關(guān).NET Smobiler復(fù)雜控件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#與.net高級(jí)編程 C#的多態(tài)介紹

    C#與.net高級(jí)編程 C#的多態(tài)介紹

    封裝、繼承、多態(tài),面向?qū)ο蟮娜筇匦裕皟身?xiàng)理解相對(duì)容易,但要理解多態(tài),特別是深入的了解,對(duì)于初學(xué)者而言可能就會(huì)有一定困難了
    2012-11-11
  • ASP.NET對(duì)Cookie的操作

    ASP.NET對(duì)Cookie的操作

    這篇文章介紹了ASP.NET操作Cookie的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • .net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入詳解

    .net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入詳解

    這篇文章主要為大家介紹了.net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • ADO.NET實(shí)用技巧兩則

    ADO.NET實(shí)用技巧兩則

    ADO.NET實(shí)用技巧兩則...
    2006-07-07
  • .NET項(xiàng)目在k8s中運(yùn)行的Dapr持續(xù)集成流程

    .NET項(xiàng)目在k8s中運(yùn)行的Dapr持續(xù)集成流程

    這篇文章主要介紹了.NET項(xiàng)目在k8s中運(yùn)行的Dapr持續(xù)集成流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • .NET提取?Thread?中返回值詳情

    .NET提取?Thread?中返回值詳情

    這篇文章主要介紹了.NET提取?Thread?中返回值詳情,關(guān)于如何獲取?Thread?中的返回值,不同的版本有不同的解決方案。需要的朋友可以參考一下
    2022-01-01
  • asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    asp.net mvc路由篇 如何找到 IHttpHandler方法介紹

    學(xué)習(xí)是使用asp.net已經(jīng)有很長(zhǎng)一段時(shí)間了,現(xiàn)在就來分析一下mvc的整過過程吧。個(gè)人計(jì)劃寫一個(gè)mvc系列的博文,僅從源代碼的角度來分析mvc。在接觸mvc時(shí)我們一定會(huì)經(jīng)歷路由,那么路由這東東是怎么搞出來的啊
    2012-11-11
  • .Net 6中的PeriodTimer介紹

    .Net 6中的PeriodTimer介紹

    這篇文章主要介紹了.Net 6中的PeriodTimer,.net 6中新增了一個(gè)異步計(jì)時(shí)器PeroidTimer,相對(duì)普通Timer的回調(diào), 它的模型更簡(jiǎn)單,下面一起來看看具體詳情吧
    2022-01-01
  • .Net Core 之AutoFac的使用

    .Net Core 之AutoFac的使用

    本文簡(jiǎn)單介紹了AutoFac的基本使用以及在asp .net core中的應(yīng)用,文中通過代碼講解相關(guān)知識(shí)非常的詳細(xì),對(duì)大家的學(xué)習(xí)或工作都很有幫助,感興趣的小伙伴可以參考一下這篇文章
    2021-09-09
  • ASP.NET Core  依賴注入框架的使用

    ASP.NET Core 依賴注入框架的使用

    還記得上篇文章中最后提及到,假如服務(wù)越來越多怎么處理呢,本篇文章將會(huì)帶來解決辦法, ASP.NET Core 依賴注入框架的相關(guān)資料,需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-10-10

最新評(píng)論

济南市| 扶沟县| 汝阳县| 浠水县| 苏尼特左旗| 黎平县| 肇庆市| 万山特区| 商丘市| 广宗县| 乐安县| 永年县| 郑州市| 柯坪县| 长丰县| 黄龙县| 旌德县| 奇台县| 友谊县| 兴文县| 石嘴山市| 长垣县| 老河口市| 隆化县| 五台县| 平陆县| 奉贤区| 乌审旗| 平山县| 武清区| 隆林| 古浪县| 介休市| 正定县| 合水县| 和田县| 巴中市| 丁青县| 榆中县| 苗栗县| 合阳县|