using System;
|
using System.Threading.Tasks;
|
|
namespace Shared.Phone.UserCenter
|
{
|
/// <summary>
|
/// 制作一个搜索控件(控件左边为文本输入,控件右边有一个搜索图标,外面是一个有弧度的框),
|
/// 添加控件后,请调用LoadEvent()函数进行回调函数的绑定
|
/// </summary>
|
public class SearchEditText : FrameLayout
|
{
|
#region ■ 变量声明__________________________
|
/// <summary>
|
/// 为了对应子线程
|
/// </summary>
|
private string m_Text = string.Empty;
|
/// <summary>
|
/// 文本值
|
/// </summary>
|
/// <value>The text.</value>
|
public string Text
|
{
|
get
|
{
|
return m_Text;
|
}
|
set
|
{
|
this.m_Text = value;
|
Application.RunOnMainThread(() =>
|
{
|
txtSearch.Text = this.m_Text;
|
});
|
}
|
}
|
/// <summary>
|
/// 搜索控件
|
/// </summary>
|
private InputTextControl txtSearch = null;
|
/// <summary>
|
/// 调用回调函数
|
/// </summary>
|
private bool LoadAction = false;
|
/// <summary>
|
/// 回调函数
|
/// </summary>
|
private Action<string> actionMethod = null;
|
|
#endregion
|
|
#region ■ 初始化____________________________
|
/// <summary>
|
/// 制作一个搜索控件(控件左边为文本输入,控件右边有一个搜索图标,外面是一个有弧度的框),
|
/// 添加控件后,请调用BindEvent()函数进行回调函数的绑定
|
/// </summary>
|
/// <param name="width">宽度</param>
|
/// <param name="height">高度</param>
|
public SearchEditText(int width = 850, int height = 120)
|
{
|
//桌布控件
|
this.Y = Application.GetRealHeight(45);
|
this.Width = Application.GetRealWidth(width);
|
this.Height = Application.GetRealHeight(height);
|
this.Radius = 8;
|
this.BorderWidth = 1;
|
this.BorderColor = UserCenterColor.Current.TextFrameColor;
|
this.Gravity = Gravity.CenterHorizontal;
|
}
|
|
/// <summary>
|
/// 绑定事件
|
/// </summary>
|
/// <param name="action">回调函数:值是输入的关键字</param>
|
public void BindEvent(Action<string> action)
|
{
|
this.LoadAction = true;
|
this.actionMethod = action;
|
|
//控件初始化
|
this.InitControl(action);
|
|
//打开搜索键值的线程
|
this.StartSearchKeysThead();
|
}
|
|
/// <summary>
|
/// 移除事件
|
/// </summary>
|
public void RemoveEvent()
|
{
|
this.LoadAction = false;
|
}
|
|
/// <summary>
|
/// 控件初始化
|
/// </summary>
|
/// <param name="action">回调函数:值是输入的关键字</param>
|
private void InitControl(Action<string> action)
|
{
|
if (txtSearch != null)
|
{
|
return;
|
}
|
//搜索
|
txtSearch = new InputTextControl(this.Width - Application.GetRealWidth(150), this.Height)
|
{
|
X = Application.GetRealWidth(35),
|
TextAlignment = TextAlignment.Center,
|
Gravity = Gravity.CenterVertical,
|
PlaceholderText = Language.StringByID(R.MyInternationalizationString.uSearch),
|
PlaceholderTextColor = UserCenterColor.Current.Gray
|
};
|
this.AddChidren(txtSearch);
|
|
var btnIcon = new IconViewControl(72)
|
{
|
Gravity = Gravity.CenterVertical,
|
X = txtSearch.Right + Application.GetRealWidth(10),
|
UnSelectedImagePath = "Item/Search.png",
|
SelectedImagePath = "Item/SearchCancel.png"
|
};
|
btnIcon.MouseUpEventHandler += (sender, e) =>
|
{
|
txtSearch.Text = string.Empty;
|
};
|
this.AddChidren(btnIcon);
|
|
string oldText = string.Empty;
|
//值改变事件
|
txtSearch.TextChangeEventHandler += (sender, e) =>
|
{
|
if (this.LoadAction == false)
|
{
|
return;
|
}
|
this.nextSearchKeys = txtSearch.Text.Trim();
|
this.m_Text = this.nextSearchKeys;
|
|
if (oldText == this.nextSearchKeys)
|
{
|
//输入的值一样
|
return;
|
}
|
oldText = this.nextSearchKeys;
|
//更改图标
|
if (this.nextSearchKeys == string.Empty && btnIcon.IsSelected == true)
|
{
|
btnIcon.IsSelected = false;
|
}
|
if (this.nextSearchKeys != string.Empty && btnIcon.IsSelected == false)
|
{
|
btnIcon.IsSelected = true;
|
}
|
//允许执行回调函数
|
this.isCanSearch = true;
|
};
|
}
|
#endregion
|
|
#region ■ 开启线程__________________________
|
|
/// <summary>
|
/// 线程开启中
|
/// </summary>
|
private bool isThreadAciton = false;
|
/// <summary>
|
/// 能否执行搜索
|
/// </summary>
|
private bool isCanSearch = false;
|
/// <summary>
|
/// 下一个搜索键值
|
/// </summary>
|
private string nextSearchKeys = string.Empty;
|
/// <summary>
|
/// 打开搜索键值的线程
|
/// </summary>
|
private void StartSearchKeysThead()
|
{
|
if (isThreadAciton == true)
|
{
|
return;
|
}
|
this.isThreadAciton = true;
|
new System.Threading.Thread(() =>
|
{
|
while (isThreadAciton && this.Parent != null)
|
{
|
//根据逻辑,不能够搜索的话,等待
|
if (this.isCanSearch == false)
|
{
|
System.Threading.Thread.Sleep(1000);
|
continue;
|
}
|
//获取当前瞬间的键值
|
string nowSearchKeys = nextSearchKeys;
|
|
//根据搜索键值,调用回调函数
|
this.actionMethod(nowSearchKeys);
|
|
//处理完毕后,如果当前的检索键值与下一个检索键值一样的话
|
//说明用户已经不再输入键值了,这个时候,停止搜索
|
if (nowSearchKeys == nextSearchKeys)
|
{
|
this.isCanSearch = false;
|
}
|
|
//如果当前的检索键值与下一个检索键值不一样的话
|
//那就说明,用户再次输入了键值,这个时候,让线程继续跑下去
|
}
|
})
|
{ IsBackground = true }.Start();
|
}
|
|
/// <summary>
|
/// 关闭线程
|
/// </summary>
|
public void CloseThead()
|
{
|
this.isThreadAciton = false;
|
}
|
#endregion
|
}
|
}
|