任务锁和自定义控件制作
大四学生,又要实习又要上课,结果好久没写了。这回分享些东西吧!
Win 8提供的控件中,有几个要么无法修改背景颜色,字体颜色等样式,要么就是有些丑,不好看。
其中隐藏菜单就是一个,无法修改菜单的背景颜色、字体颜色,鼠标划过颜色和点击的颜色。
消息框,一样无法修改它的样式。而下拉选择框则是比较丑陋(个人以为,不要在意)。
所以,为了和项目风格搭配,只好自己实现这些控件。首先,直接上图,看看效果。

MyControl.MyMesseageBox mbox = new MyControl.MyMesseageBox(); int res = await mbox.Show(this.ActualWidth / 2, this.ActualHeight / 2,Message);
而为了能做到await 等待我们处理完得到选择结果,而且又不会卡主UI线程,这时候就要用到一个任务锁的类。关于这个类,是我在一个外国人的博客看到的,非常好用。Win 8的Sqlite数据库好像还没有见到有事务的用法。而有时需要达到事务的效果,就可以使用这个事务锁。废话不多说,直接贴代码!
public class AsyncSemaphore
{
private readonly static Task s_completed = Task.FromResult(true);
private readonly Queue<TaskCompletionSource<bool>> m_waiters = new Queue<TaskCompletionSource<bool>>();
private int m_currentCount;
public AsyncSemaphore(int initialCount)
{
if (initialCount < 0) throw new ArgumentOutOfRangeException("initialCount");
m_currentCount = initialCount;
}
public Task WaitAsync()
{
lock (m_waiters)
{
if (m_currentCount > 0)
{
--m_currentCount;
return s_completed;
}
else
{
var waiter = new TaskCompletionSource<bool>();
m_waiters.Enqueue(waiter);
return waiter.Task;
}
}
}
public void Release()
{
TaskCompletionSource<bool> toRelease = null;
lock (m_waiters)
{
if (m_waiters.Count > 0)
toRelease = m_waiters.Dequeue();
else
++m_currentCount;
}
if (toRelease != null)
toRelease.SetResult(true);
}
}
使用这个锁,就可以实现等待了,至于控件想做成什么样,这就要看你Xaml上面的功底了,或者使用Blend设计也是不错的选择。

浙公网安备 33010602011771号