網站首頁 編程語言 正文
存在意義
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的多樣性,豐富用戶使用場景,其高可用又大大節約了用戶的開發時間。
原文鏈接:https://blog.51cto.com/u_14360220/5556137
相關推薦
- 2022-05-29 消息隊列應用場景介紹_其它綜合
- 2022-05-18 ASP.NET?MVC自定義異常過濾器_實用技巧
- 2022-08-04 C語言實現快速排序算法實例_C 語言
- 2022-04-21 python數據類型bytes?和?bytearray的使用與區別_python
- 2022-04-11 C++17之std::any的具體使用_C 語言
- 2022-04-24 C語言時間函數之mktime和difftime詳解_C 語言
- 2022-11-01 React?Hooks?useReducer?逃避deps組件渲染次數增加陷阱_React
- 2022-01-19 標準時間格式轉換(正則寫法)
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支