任务锁和自定义控件制作

大四学生,又要实习又要上课,结果好久没写了。这回分享些东西吧!

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设计也是不错的选择。

原文地址:https://www.cnblogs.com/qingfengwutong/p/2957795.html