大四学生,又要实习又要上课,结果好久没写了。这回分享些东西吧!
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设计也是不错的选择。