关于爱情和爱情的附加值

看到一篇好文。出处未找到。分享之。如果你不能静下来看完。那么就看我画出来的部分吧。  我一直在想,假如查尔斯王子只是一个普通的男人,那么19岁的戴安娜还会在明知他另有所爱的情况下嫁给他吗?在戴安娜一段被公开的录音带中,她曾经说大婚那天是她生命中最糟糕的一天——“我的心像死一样平静,我感觉自己像待宰的羔羊。”  她其实是可以不必那么可怜的,没有人把她送到案板上,是她自己愿意的。如果她不肯,谁还会强迫她站在教堂里对另一个男人说“我愿意”,是她自己说的。但是能责怪她吗?假如换着是我,我是不是也会说“我愿意”呢?我能分得清楚我是在对一个比自己年长很多而又与前情人藕断丝连的男人说“我愿意”,还是对那一顶令人羡慕的未来王冠说“我愿意”?即使当时年幼,戴安娜分不清楚这二者的区别,但后来她实际上也是有很多机会的。当他与查尔斯王子名存实亡以后,她是可以选择离婚的,但是她迟迟不肯,即使全世界都知道他们感情不在,她依然固执的要求保留“王妃”的头衔。也许是她已经习惯被称为“戴安娜王妃”,也许是她觉得自己为这个称号付出了太多,所以她不能失去这一荣誉。  据说英国电视台要以查尔斯、戴安娜和卡米拉的故事为蓝本拍一个片子,名字叫《爱情究竟是什么》。是呀,敢问情是何物,竟叫人生死相许?  我是读着《简·爱》长大的,我的爱情启蒙就是那个出生卑微的女教师对身份高贵的男主人说的那段话:“你以为我穷,不美,就没有感情吗?我也有的,假如上帝赐予我美貌与财富,我一定会使你难以离开我,正如我现在难以离开你,上帝没有这样做,但是我们的精神是平等的……”  待我长大一点,我冷不丁地想:如果上帝赐予简·爱小姐美貌与财富,她还会爱上那个又老脾气又坏的罗切斯特先生吗?不要责怪女人对爱情的态度,除了七仙女,没有几个女人会看上卖身为奴的董永。七仙女不食人间烟火,她有神仙血统,人间名利对于她来说,只要她想要,还不是唾手可得?她要的是一个她喜欢的男人,只要她喜欢就够了。你挑水我浇园,夫妻恩爱不夜天。对于七仙女来说,爱就是一件简单得不能再简单的事情。她不指望从爱情中再捞到些别的,因为别的,她可以用别的方式得到,惟有爱情本身是不可替代的。 但是对于我们寻常女子来说,我们能做得到吗?喜欢上一个男人,就跟他欢天喜地?我相信许多人是做不到的,因为我们对爱情的指望太多,我们期待从爱情中得到“附加值。我们对自己说,世上没有无缘无故的爱,如果爱一个人,不能给自己带来提升,为什么要爱他呢?甚至有许许多多的爱情指南大大方方地告诉我们:干得好不如嫁得好,为什么不能一举两得?嫁一个优秀的男人,既得到爱情又得到财富。是呀,为什么不呢?问题是世界上哪里有那么多便宜事?即使美丽如戴安娜王妃都无法如愿,何况我们呢?  要女人在一开始就分清楚,爱一个人,还是爱一个人所能提供的生活,这是很难的。跳水公主郭晶晶在被问到与富家公子的关系时,她说:“我爱一个男人不是爱他的钱,而是他的修养。”听到她这话的人都笑了:“原来不是为钱啊,如果那个男人是一个穷光蛋,你会发现他有修养吗?”  看过李少红拍的一部电视剧《橘子红了》,当中有一个周迅扮演的角色,名字叫秀禾。她本是一个穷人家的女孩子,为了改善家庭经济,缓解家人负担,自愿嫁到富人家里做三姨太,因为样貌可爱深得老爷喜欢,但是她在满足了一切物质需要以后,她发现自己真正爱的人是老爷的弟弟。  女人总是这样的,常常听女人评论什么样的男人不值得爱,她们往往会撇着嘴说,那些不成功没有经济能力的男人是不能嫁的,他们缺乏富人的风度和心胸。其实女人自己何尝不是这样?那些没有尝过富裕生活滋味的女人,有几个能像张曼玉那样,冷冰冰的抛出一句台词:“你有钱有什么了不起?我也有啊!”  在年少无知的时候,常常搞不懂富人家的女人为什么会偷情。尤其是封建社会,那是一旦被发现就要沉塘的死罪,可是为什么女人会冒着生命风险去做这等事情?就像秀禾,嫁给老爷之前,她的幸福愿望就是能得到老爷的宠爱,能对得起大太太的照顾,但是当她轻而易举地得到这一切以后,她却发现自己很痛苦。甚至比嫁入豪门之前还痛苦,那时她不过是穷,但是现在她觉得不自由,因为她没有爱情。  爱情究竟是什么?这个世界上到底是否存在纯粹的爱情?是什么让罗密欧与朱利叶生死相随?是什么让温莎公爵舍弃江山和王位?难道真的是因为他们幼稚或一时冲动吗?我相信不是。爱是一种无法替代的感情,除了和你爱的人在一起,否则你无法感受到爱的幸福。但是爱情的附加值则是可以替代的,如果你希望通过爱情而获得财富,那么当你获得财富以后,你就不认为你还需要和那个财富的提供者在一起。尤其当你借此成长起来,并且建立了自己的财富王国,你就不愿再忍受当初那个“男人”。因为你自己也有了,所以他在你的生活中很快就会成为一个多余的人,一个碍手碍脚的人,一个妨碍你追求幸福和自由的人。 出生于法国的英国作家毛姆曾经说过:“感情有理智所根本不能理解的理由。”他在传世之作《月亮和六便士》(卓越 当当 京东)中描写了一个名叫爱施略夫的男人,那是一个从任何一个角度讲都称得上是“好丈夫”的男人。他有钱,给妻子提供了安逸的生活,他对妻子很好,什么事情都由着她的心思。而她的妻子对他也一直很不错,直到有一天,他的妻子遇到一名穷困潦倒生活不能自理的画家。这名画家的原型据说是高更。人们都谴责这名画家勾引了这名良家妇女,但是毛姆另有解释,原话摘录如下:“过去我认为她爱施特略夫,实际上只是男人的爱抚和生活的安适在女人身上引起的自然反应。大多数女人都把这种反应当爱情了。这是一种对任何一个人都可能产生的被动的感情,正像藤蔓可以攀附在随便哪株树上一样。因为这种感情可以叫一个女孩子嫁给任何一个需要她的男人,相信日久天长便会对这个人产生爱情,所以世俗的见解便断定了它的力量。但是说到底,这种感情是什么呢?它只不过是对有保障的生活的满足,对拥有家资的骄傲,对有人需要自己沾沾自喜,和对建立起自己的家庭洋洋得意而已。女人们秉性善良、喜爱虚荣,因此便认为这种感情极富于精神价值。但是在冲动的热情面前,这种感情是毫无防卫能力的。”  女人在爱一个男人的时候,到底是更爱这个男人本身,还是爱他所能提供的生活品质?当女人一无所有的时候,那些爱情的附加值将对女人具有极大的诱惑力,但是当她自己成长起来,足够强大到凭自己的能力也可以得到梦想的生活时,那些所谓的附加值在女人眼里就一钱不值了。凡是通过努力通过购买可以得到的东西,独立女性在成功以后也是可以享受得到的,为什么要靠男人?但是爱情却是可遇不可求的,好容易在茫茫人海中看到一个如意的人,那种冲动就像七仙女看到董永一样,她一定是迫不及待地下凡,因为惟有下凡,才体会得到凡间的快乐。  我一个女性朋友,有一段时间一直犹豫不决。两个男人她都喜欢,男人甲与她青梅竹马,男人乙与她邂逅相逢。男人乙是一公司的高级职员,有车有房经常带她去吃西餐,男人甲在一名不见经传的公司做文案,骑自行车租地下室偶尔在外面吃一顿,也都是马兰拉面麦当劳。她很苦恼,她说喜欢与男人甲在一起的感觉,虽然穷,但是总是有很多话很快乐很亲密,但是她不喜欢与男人甲在一起的生活。虽然男人甲对她保证两年内就可以攒足房子的首付,但是要等两年,而且那房子一定是四环以外的。至于男人乙,她喜欢他所提供的生活,但是她觉得他很闷,与他在一起她总是很紧张,连吃西餐刀叉的姿势都在家练了又练。我们说,你可以等一等,不用很着急呀。但是她很着急,我知道她急什么,她等不得,她要立刻兑现。既然这样,她当然要选择那位经常能带她去吃西餐的男人乙了,因为对于她来说,这样的男人属于现钞。  也许因为男人乙很闷吧,再加上高级职员的工作很忙,她婚后仍有大把时间。她是一个很努力的女人,大部分时间都用来进修,反正老公有钱,那么学习总不是错吧?之后她跳槽,升职,加薪,她轻而易举地买了自己想买的房子,但是她却不肯与自己的老公分享,因为他没有爱的价值。  不要说我的朋友不痛苦,她如果不痛苦她就不会找我倾诉了。她想再找回当年的感情,但是那难度比找回去年的雪还大。她常常抱怨,我当时为什么这么傻?不就是一个三环边的房子和一辆富康车吗?不就是几顿小情小调的西餐吗?我就答应和他生活一辈子,一辈子是多长的时间啊!  我们都不能否认爱情中除了有爱情还有其他的东西,自古以来就有无数女人通过爱一个男人而彻底改变自己命运的例子,那些女人到底是幸运还是不幸?我想假如她们像从来没有吃过禁果的夏娃,或者像从来没有向人间偷窥的七仙女,她们也许是幸运的,因为她们不知道什么叫爱情。她们以为爱情就是她们已经得到的生活,但是千万不要让她们接触到任何与爱有关的事物,那会大大刺激她们的。她们在刺激之下,会觉得自己是最可怜的女人。就像查泰莱夫人一样,丈夫那样有地位有身份,但是当她懂得什么叫世间的爱之后,她还是义无返顾抛家舍业。因为她知道,那种爱是无法替代的,是物质生活不能补偿的。我不希望你像查泰莱夫人一样,在忍受那么多屈辱、不幸、心灵的折磨之后,才奔向情人的怀抱。你原本是没必要给自己找那么多麻烦的, 一个你不爱的男人,即使一切都好,又能好到哪里去呢?无非是他能给一些你现在还得不到的生活品质,但是如果你对自己有信心,那些所谓的生活品质是很难达到的吗?也许现在你会为一个肯送你路易威登手提袋的男人而心动,但是当你自己可以到巴黎总店随便挑选的时候,你还会为那个男人心动吗?你还会因为他送得起这样一个昂贵的包而凭空给他打几个高分吗? 世间值得追求的东西很多,但惟有爱情,是必须真心相爱才可以尝到它的滋味的。而其他的东西,你得到它的途径其实有很多,并不一定非要通过和一个人结婚才可以得到。既然这样,你为什么要给自己的爱设定那么高的门槛?我担心的不是你对爱的要求太高,我是担心迈得进你门槛的人,恰恰都是与爱无关的人。因为真爱是不需要门槛的,而且也不屑于门槛。爱是两情相悦,你情我愿,又不是在自由市场挑西红柿,非要找性能价格,比最合理的。  恋人之间最爱问的一句话,大概就是“你爱我什么?”从来没有人会说我爱你的钱,你的财富,你所能给我提供的生活,为什么?因为我们都知道那太煞风景。至今为止,我听到的最动人的答案是一句英文:“I LOVE YOU NOT BECAUSE OF WHO YOU ARE,BUT BECAUSE OF WHO I AM WHEN I AM WITH YOU.”我不知道如何把它翻译得浪漫多情,但是我想即使是直截了当的翻译,那其中的真情也足以动人:我爱你,并不是因为你是谁,而是因为和你在一起时,我才是最真实的我。 [text]PS:私自觉得那句英文应该翻译为:我爱你,不是因为你是谁,而是因为我在你面前可以是谁。[/text]

理解并实现原型模式-实现ICloneable接口.理解深浅拷贝

本文用C#实现原型模式,也会讨论深浅拷贝,已经如何在.net中高效实现ICloneable 接口 介绍 有时候我们需要从上下文得到一个对象的拷贝,然后通过一些独立的操作来处理他。原型模式在这种情况下很适用 GoF 定义原型模式为用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype.” 看一下类图 主要的参与者有 • Prototype: 抽象类或接口,定义了方法来拷贝自己 • ConcretePrototype: 克隆的具体类. • Client: 需要执行拷贝对象的软件对象 然后实现吧 使用代码 为了简化。我以一个著名的偷车游戏作为例子 我们说游戏里有一个注脚。这个主要有着一些定义游戏数据的统计量。保存游戏的时候我们就需要拷贝这个对象,然后序列化到文件中。(仅仅是举个例子,真实的游戏里很少这样做) 下面这个类抽象类就是概念中的Prototype  接口定义了玩家重要的信息,然后定义了一个Clone方法。然后我们定义一个具体的玩家类CJ。这样我们可以克隆当前对象,然后异步的进行序列化 这个类就是概念中的ConcretePrototype 。这里为了简化也没有其他一些方法了。 现在看看客户端软件的写法 理解深浅拷贝 上面的代码就模拟了原型模式,有一个问题就是我们使用了MemberwiseCopy 方法。而这个方法是创建浅拷贝的。如果对象里包含引用类型,引用类型的地址就会被从前者拷贝到后者。这样。两个就指向了同样的对象。 为了说明情况。我们让主角类包含更多的,叫做AdditionalDetails  然后抽象类将会一个AdditionalDetails 对象  具体类既然使用MemberwiseCopy实现拷贝  问题来了。两份拷贝会指向同一个AdditionalDetials 对象 画个图。看得清楚些 为了避免这种期刊。我们需要在堆上创建引用类型的拷贝,然后对应赋值  这样就可以了 注意。当执行深拷贝的时候,可能引用类型来包括引用类型,因此好的做法是用反射。并且递归的拷贝。直到没有引用类型,具体可参考另一文 实现ICloneable接口 ICloneable接口提供了定义拷贝方法的接口。我们可以使用ICloneable 作为概念中的Prototype,我们看一下如果实现ConcretePrototype  客户端代码如下 Demo下载 [downloadicon href=http://pan.baidu.com/share/link?shareid=86332&uk=1493685990]PrototypeDemo.zip[/downloadicon] 原文地址:Understanding-and-Implementing-Prototype-Pattern-i 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

实现IEnumerable接口&理解yield关键字

本文讨论题目的内容。然后讨论IEnumerable接口如何使得foreach语句可以使用。之后会展示如果实现自定义的集合类,该集合类实现了IEnumerable接口。Yield关键字和遍历集合后面也讨论。 背景 一使用集合。就发现遍历集合就跟着来了。遍历集合最好的方式是实现迭代器模式-Understanding and Implementing the Iterator Pattern in C# and C++(这篇文章我过几天翻译一下) ,C#提供foreach来以一种优雅的方式遍历 只要集合实现了IEnumerable 接口就可以用foreach来遍历。 使用代码 首先先看一下内置的集合类如何使用foreach来遍历的。ArrayList实现了IEnumerable 接口。我们看一下  遍历泛型集合类 Arraylist 是一个通用集合类,遍历泛型集合类也可以。因为这些泛型集合类实现了IEnumerable<T>接口,看一下吧。  发现了吧。我们自定义的集合类或是泛型集合类应该实现IEnumerable和IEnumerable<T>接口。这样就可以遍历了。  理解yield关键字 在写个实现接口的例子之前,先理解一下yield关键字,yield会记录集合位置。当从一个函数返回一个值的时候,yield可以用。 如下的普通的方法。不论调用多少次,都只会返回一个return  原因就是普通的return语句不保留函数的返回状态。每一次都是新的调用。然后返回第一个值。 但是使用下面的语句替换后就不一样。当函数第二次调用的时候。会从上次返回的地方继续调用 显然返回1,2,3,唯一要注意的就是函数需要返回IEnumerable。,然后通过foreach调用。 在自定义的集合类里实现Ienumerable接口 现在如果我们在我们的自定义集合里定义一个方法。来迭代所有元素。然后通过使用yield返回。我们就可以成功了。 好。我们定义MyArrayList 类,实现IEnumerable 接口,该接口就会强制我们实现GetEnumerator 函数。这里我们就要使用yield了。   之后你就可以用foreach遍历了。  这个类啊。没写好。也不完整。只要是让你理解。。模拟一下而已。 自定义泛型类里实现Ienumerable<T>接口  之后就可以使用foreach了。 ** 源代码下载** [downloadicon href=http://pan.baidu.com/share/link?shareid=86013&uk=1493685990]EnumerableDemo.7z[/downloadicon] 原文地址: A-Beginners-Tutorial-on-Implementing-IEnumerable-I 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

分享几个电子书资源站点

看到书签里有好些电子书的资源站。今天心情不错。遂起了分享的念头。。 对于计算机相关专业人隆重推荐小书屋 作者很认真的在分享技术/安全/心理学/技术PPT方面的书籍。算是国内技术书籍比较好的分享站点了。 如果你没有找到自己喜欢的书。那么试试forfrigg,是一个电子书籍整合站点。使用该网站。不只可以下载kindle书籍。更是能够搜索新浪,doukan等诸多网盘内容。实乃书籍下载必备引擎啊。 什么?你只想下载百度文库的?没积分?好吧。那我告诉你一个类似的镜像站点–文库大全,这个站和百度文库差不多。资源很丰富。想下什么。就去下吧。。 如果在这里没找到。。而你发现百度文科的积分是0 1 2 5那么试试帮手吧。免费下载。原版哦。稍多一点的积分就不可以了。如果你和博主私交不错。我帮你搞定。 如果你是大牛。。只喜欢看英文原版的。。那么先去七彩英语看看吧,优秀的英文电子书下载站。从技术到小说应有尽有。界面也漂亮。 还嫌少?那去国外溜达吧。ebook-downloader 随时欢迎你的光临。全球最大电子书下载平台。。尽情享受阅读的快感吧。。 update:感谢@Shiyao Yu的推荐-皮皮书屋。很小众。但资源很全。需注册。注册用户每天可下三本。最喜欢小众什么的了。我试着搜了一下计算机的。确实挺全。 ps:如果你收藏了其他的站点。不妨留言回复。

模拟Office2010文件菜单的TabControl模板

这是Office2010中的文件菜单点开后的效果。本文我将以强大的WPF来实现类似的效果。希望你能有所收获。而不是只拷贝/粘贴代码而已。  开始之前。先把TabControl找个地方放着。  然后会大概是这个效果 为了改变TabControl的显示效果。我们使用模板机制,我们把模板写进一个资源字典里。这样就可以重用了。添加一个资源字典的步骤如下 右键点击工程-添加-资源字典 然后在资源字典里添加一些代码。  之后,我们为VisualState创建故事板,一个是正常状态。会使得hoverShape的透明度为0.另一个是鼠标悬停的状态。透明度会变成1  当你运行的时候你会发现没什么变化。我们还要定义被选中标签的VisualState 当添加如下代码的时候 添加一个VisualState组。也就是 SelectionStates ,然后给选中/为选中的状态添加行为/故事板。.这里通过修改透明度来实现一些效果  现在再运行会发现效果更好了  还有个小问题,就是那个陷进入的小三角形的背景颜色依然还在。通过在下面添加一个白色的形状。,并且对故事板的选中和为选中状态改变一下透明度就可以了。  最终效果如下: 源代码地址: [downloadicon href=http://pan.baidu.com/share/link?shareid=85332&uk=1493685990]OfficeTab.7z[/downloadicon] 许可 本文包括源代码和文件在CPOL下授权 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

类型安全的黑板模式(属性包)

有时候对于对象来说。在一个软件中,不直接通过互相引用而做到共享信息是非常有用的。比如像带有插件的软件。可以互相进行通信。假设我们有了很多对象。其中一些包含一些数据。而另一些对象需要消费这些数据 不同的子集,我们不通过对数据生产者和消费者的直接引用来实现,而是通过更低耦合的方式。叫做创建一个“BlackBoard”(黑板)对象。该对象允许其他对象自由对其进行读取/写入数据。这种解耦方式使得消费者不知道也不必知道数据来自哪里。如果想要了解更多关于黑板模式的信息。我们常说的。Google是你最好的朋友。 一个最简单的黑板对象应该是 Dictionary一些简单的命名值的字典。所有的对象共享同一个字典引用。使得他们可以交换这些命名数据。这种方法有两个问题。一个是名字。一个是类型安全—数据生产者和消费者对每一个数据值都必须共享一个字符串标识。消费者也没有对字典中的值进行编译时的类型检查,比如,可能期望一个小数,结果运行时读到了字符串。本文对这两个问题演示了一种解决方案。 背景 最近我在开发一个通用任务的异步执行的引擎。我的通用任务通常有Do/Undo方法。原则上是相互独立的,但是有一些任务需要从已经执行的任务重请求数据。比如。一个任务可以 为一个硬件设备建立一个API,随后的任务就可以使用创建好的API来操作硬件设备。但是。我不想我的执行引擎知道关于这个执行任务的任何信息。而且。我也不想直接手工的就在一个任务里引用另一个任务。 黑板类 黑板类本质上是一个Dictionary的包装类,对外暴露Get和Set方法。黑板类允许其他对象存储并且取回数据。但是要求这些数据使用一个 BlackboardProperty 类型的标识符来表示这些数据是可存取的。BlackboardProperty 对象应该在那些准备读写黑板类的对象之间共享,因此,他应该在那些类中作为一个静态成员。(很像WPF的依赖属性。是他们所属控件的静态成员) 注意:命名安全应该可以通过同样的方式实现。但是但是依然没有解决类型安全的问题。那么。到了主要的部分了。那就是黑板类的代码了 黑板属性(BlackBoardProperty)类 BlackBoardProperty 类 提供了一个标识符来存取黑板对象中的数据。定义了名称和值的类型。也定义了一个默认的返回值。以防黑板类中对应属性没有值。 我承认不是非常有用的代码。但是。能够模拟两个类的使用。 下一个例子会更和现实情况接近。但是肯定是被简化过了的。在下面的例子里。我定义了集中不同的任务。我用这些任务来启动对硬件设备的连接。操作设备。关闭连接。这些任务通过一个执行引擎依次执行,这些任务通过一个公用的黑板类来共享数据。至于这个任务类的和执行引擎(ExecutionEngine)类还是留到另一篇文章中把。 黑板类另一种可能的使用情况就是一个支持插件的软件。如果需要的话允许插件进行通信,这种情况下属性改变的时候能够通知是很有用的。 还有一件重要的事情是注意 BlackboardProperty 实例一般应该作为逻辑上拥有该属性的类的一个静态成员。那么既然那是静态的。同样的BlackboardProperty 实例就可以出现在多个黑板对象里。当某一个给定的属性。黑板对象里没有值的时候。他会请求BlackboardProperty 实例提供一个默认的值。缺省的值可能是一个引用类型,因此,如果你不想在多个黑板对象间共享同一个引用。在创建BlackboardProperty 对象的时候务必使用下面的构造函数。 public BlackboardProperty(string name, Func createDefaultValueFunc) 这就会使得默认的值不会在多个黑板对象间共享。 有意思的地方 我应该说过了。这个方案一部分是受微软WPF中依赖属性的影响。还参考了我前段时间读到的一篇关于枚举类的文章 许可 本文包括源代码和文件在CPOL下授权。 原文地址: Type-safe-blackboard-property-bag 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

如何创建WPF用户控件&在WPF项目中使用

作者给的Demo我合并了下。VS2010直接打开解决方案。二者都有。 介绍 本文展示在WPF中如何创建用户控件并且如果在WPF项目中使用。我将使用VS2008和C#来展示如何创建一个自定义的ToolTip 背景 这篇由Sacha Barber.写的和我的有点像。 使用代码 开始。首先,我们创建一个用户控件。因此,我们选择新建WPF用户控件类库(WPF User Control Library)。 现在。我们可以创建或者编辑XAML代码来创建自定义的用户控件了。我使用XAML来创建自定义的ToolTip。你想做什么随你。  同时。我们需要添加一些方法和属性来控制这些元素。  完成之后。我们按Shift+F6快捷键来生成dll文件。现在可以创建WPF项目并且使用我们的控件了。我们选择WPF应用程序项目 然后。我们添加对我们的控件生成dll的引用(注意。其实还可以把这两个项目放在同一个解决方案里。然后此处添加对项目的引用就可以 –译者) 我们将会在XAML窗体里使用自定义的用户控件。因此我们需要添加一些额外的XAML代码。我们在Window元素里添加下面一行。 至少。我们必须有一个Window 元素。。 好。现在我们在XAML中像这样使用控件 最后。我创建了如下的XAML代码:  再写一些方法来显示/隐藏我们的自定义ToolTip 完了。 Demo下载 [downloadicon href=http://pan.baidu.com/share/link?shareid=83438&uk=1493685990]CustomToolTipDemo[/downloadicon] 许可 本文包括源代码和文件在CPOL下授权。  原文地址:How-to-Creating-a-WPF-User-Control-using-it-in-a-W 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

WPF绘制圆角多边形

介绍 最近,我发现我需要个圆角多边形。而且是需要在运行时从用户界面来绘制。WPF有多边形。但是不支持圆角。我搜索了一下。也没找到可行的现成例子。于是就自己做吧。本文描述了圆角多边形的实现,也包括如何用在你的项目里。在Demo里面的RoundedCornersPolygon 类是完整的实现。 下载的Demo包括两部分 1. 通过XAML绘制圆角多边形 2. 运行时创建圆角多边形 背景 多边形可以被认为是沿着一个给定半径的圆的边缘和一些指定点/边。所构成的点的集合。 在WPF中。你可以给Polygon对象的Points属性添加一系列的点来制作多边形。 XAML方式 C#方式  上面两个例子会输出下面的矩形 使用代码 我写的RoundedCornersPolygon 类和普通的多边形类很相似。但是有更多的属性来控制圆角。首先。看一个例子。展示一下圆角矩形类的使用 XAML方式 C#方式 输出如下: 多边形有四个主要属性 ArcRoundness 属性指定了从距离LineSegment终点多远的距离开始弯曲,通常和UseRoundnessPercentage 一起使用。UseRoundnessPercentage属性指定了ArcRoundness 值是百分比还是一个固定的值。 举个例子。ArcRoundness 被设置成10,而且UseRoundnessPercentage 被设置成false,那么弯曲将会在距离线段终点10的地方开始。而如果UseRoundnessPercentage 被设置成ture。则会是从线段终点10%的地方开始弯曲。 IsClosed 指定多边形的最后一个点是否和第一个点闭合。为了成为一个多边形。一般应该被设置为true  Points属性则代表了多边形点的集合。  如何实现 控件实现了Shape 类,被用来画多边形的形状是一个Path对象。我们会往Path对象里添加LineSegment 和QuadraticBezierSegment 对象。QuadraticBezierSegment 对象表示一个贝塞尔曲线。由三个点定义。更多的信息请查看 对于一个普通的多边形,只有LineSegment是必须的,但是为了设计圆角多边形。就需要贝塞尔曲线了。每一次一个点被添加/一个属性被修改。形状会重绘。做圆角的关键方式就是ConnectLinePoints 方法。  还有两个方法计算弯曲部分开始的点GetPointAtDistance 和GetPointAtDistancePercent,第一个是以值计算,第二个是以百分比计算。  结论 依然有很多细节应该完善的。但这仅仅是圆角多边形的一个尝试。比如。在其他情况。每个角应该有不同晚景的圆角,WPF使得一切皆有可能。本文的目的是创建一个大家可以用的圆角多边形,他们可以扩展来满足他们的需求。 Demo下载 [downloadicon href=http://pan.baidu.com/share/link?shareid=82217&uk=1493685990]圆角多边形[/downloadicon] 许可 本文包括源代码和文件在CPOL下授权。 原文地址:WPF-rounded-corners-polygon 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

一步步教你制作WPF圆形玻璃按钮

1.介绍 从我开始使用vista的时候,我就非常喜欢它的圆形玻璃按钮。WPF最好的一个方面就是允许自定义任何控件的样式。用了一段时间的Microsoft Expression Blend后。我做出了这个样式。我觉得做的还行。因为。我决定分享。如我所说。我使用Microsoft Expression Blend来做。但是。我也是用XAML编辑器–Kaxaml。 2.概述 玻璃按钮样式包含了三层。组织了玻璃效果(Glass Effect)和一个ContentPresenter 来存储按钮的内容。所有的这些层都在一个最外层的Grid里。当鼠标放到按钮上,按下去的时候也定义了一些触发器(Triggers),来增加一些交互。 我把这个样式做成了资源文件。但是这个Key可以删除,来使得所有的按钮都是这个效果。 好我们来看一下这些层次。这些被广泛应用在微软产品中的按钮。 **3.按钮层次 ** 3.1背景层 第一层是一个椭圆。其实是一个canvas,一会在上面画反射和折射层,填充的颜色和按钮的背景(Background)关联。 下面是Blend中的截图 图2 3.1.1折射层 第二层模拟了光从上到下的折射。被放在反射层之前是因为,要达到反光玻璃的效果,反射层必须在按钮的中间某处有一个硬边缘。这一层实际上是另一个椭圆。但是这次。我们使用一个径向渐变(白色-透明)的填充。来模拟光的折射。渐变开始于第一层底部的中央。结束于上面的中间。然而。为了降低折射光的强度。渐变还是开始于椭圆的底部再下一点为好。可以从图上和代码里清晰的看到。  3.1.2反射层 第三层是光的反射层。是最难的部分。问题是反射效果不能使用任何标准的形状来画。因此。使用路径(Path)来画反射区域。当时。手工画也是可以的。但老实说。手工画图实在没什么可享受的(除非你是一个艺术家,或者有一个数位板),无论如何。我现在MS Blend中华好一个椭圆并转换成一个路径,然后我使用贝塞尔曲线点调整得到平滑的路径,你可以添加渐变到一个复杂的Path对象上。就像你对其他与定义的图形,比如椭圆,矩形所做的一样。为了得到光泽反射。我额每年需要一个透明-白色的径向渐变填充,从路径的底部开始(也就是按钮的中间某处),结束在顶部。我想如果我是一个艺术家。我会让渐变更准一点。可是我不是。因此。就这样。因为我们要把我们的按钮放在一个Grid里。所有我们设置VerticalAlignment="Top” 这样反射区域在按钮的中间的结束了。 图三  最后。我添加一个ContentPresenter 到按钮中间。经验告诉我,内容区域再向下一个像素会使得按钮看起来更漂亮。因此,在这里我用了margin属性(注意。因为内容区域在Grid的中间(Center)。所以2个像素的top实际上是向下移动了一个像素 ) 好了。最后在Blend中看起来大概是这样 图4 4.添加一些交互性 4.1鼠标悬停效果 为了有鼠标悬停效果,我们需要增加光源的亮度。因此。我们为IsMouseOver 事件定义一个触发器,复制并且粘贴反射和折射层的渐变设置代码。对于折射层。我仅仅移动了渐变的起点向上了一点。在反射层中。我改变了渐变停止点。使不透明的白色多一点。  4.2鼠标点击效果 对于IsPressed 事件,需要降低光。因此。反向操作即可。折射层中光源下一点。反射层中渐变停止点更加透明一些。  再说一次。渐变停止点的值靠经验选的。我也不能给出精确的值。 5.使用代码 为了使用这个样式。把定义在GlassButton.xaml 里的样式资源文件并不到你的窗体/页里。然后设置按钮的样式为{StaticResource GlassButton}. 为了设置按钮的颜色。使用Background属性即可。   6.Demo下载 [downloadicon href=http://pan.baidu.com/share/link?shareid=81378&uk=1493685990]Demo与源代码下载[/downloadicon] 7.许可 本文包括源代码和文件在CPOL下授权。 原文地址:a-style-for-round-glassy-wpf-buttons  著作权声明:本文由http://leaver.me 翻译,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

自定义WPF LinkLabel 控件

WPF里是没有LinkLabel控件的。因此我自己写一个。首先。我们看一下WPF中什么类似的组件可以实现这个链接功能 如果你想要模拟一个LinkLabel控件。你可以在TextBlock里使用内联的Hyperlink。像下面这样 你可以使用Label控件。加一个内联的HyperLink,但是我认为TextBlock更好。因为你可以在Expression Blend 中通过InlineCollection 编辑所有子元素的属性 图1 虽然这种方法也行,但是我还是不太喜欢。因为我觉得我还是写一个类似windows窗体程序中的LinkLabel控件。然后我就做了。首先看一下控件的样子 图2 第一个是默认的LinkLabel控件。第二个是LinkLabelBehavior 属性被设置为HoverUnderline ,第三个的Foreground和 HoverForeground 属性都使用了自定的颜色。  LinkLabel控件支持的属性 1.Foreground和 HoverForeground属性 允许自定义这两个属性的值 2.LinkLabelBehavior 属性 允许设置下划线的显示与否 3.自定义HyperlinkStyle 属性 你可以使用这个属性给超链接设置自定义的样式。如果你已经自定了Foreground和 HoverForeground。则会被覆盖。 Url 超链接的目标 所有这些属性都继承自标准的System.Windows.Controls.Label 控件 通过Blend/Xaml设置这些属性很简单 图三 然后是控件的使用方法。仅仅添加命名空间到xaml中。然后使用就行了。  控件的完整代码很简单。就定义一下需要的属性,和控制这些属性应该显示在Blend中的(category)目录位置就行了。   为了使得内容可以绑定。我使用了Filipe Fortes 实现的BindableRun 我添加BindableRun 到控件模板中  为了支持主题显示。应该在工程里有个Themes文件夹。包含控件的样式。LinkLabel只有一个样式文件Generic.xaml,因为超链接样式不管当前主题是什么。都是一样的。我不会包含LinkLabel 的模板。  多看源代码。下载并且开始使用吧。 示例和源码下载 http://www.blagoev.com/blog/post/building-a-wpf-linklabel-control.aspx