ToggleSwitch Winforms控制

, 介绍 所以,再一次,我发布了一篇关于自定义绘制Winforms控件的文章。我想我应该把我的资料名改为“控制狂”…但管它呢:我喜欢编程自定义控件!这没什么可做的。 这一次,我需要一个ToggleSwitch或ToggleButton——能够以一种比标准复选框更有趣的方式显示二进制打开/关闭选中/未选中状态的东西。像往常一样,我开始检查现有的控制,因为谁愿意花大量时间重新发明已经被发明的东西??通常发生在我身上的事情这次也发生了:我发现现有的控制本可以很好,但却让我在某些方面有所欠缺。我能找到的最好的(而且看起来也很不错)是IKalai的这张(当然是在CP上)。但我对伊卡莱的控制有一些问题。最重要的一点是,它不允许你随心所欲地改变控件的大小,而且我无法将它设置为应用程序所需的大小……我真不明白他为什么要把这种奇怪的限制强加在他的控制能力上! 我还发现了这个,它看起来更好——但是唉,它是为WPF/Silverlight构建的,所以我不能使用它。 所以我做了我经常做的事:我开始控制自己。像往常一样,我完全做过头了,把它做得比我真正需要的高级得多。上面两篇文章给了我灵感,让我设计了一个可以有很多不同外观的控件,而不仅仅是设计一个我想要的外观和行为的控件。最后,我总结出了10种不同的样式,还可以进一步定制这些样式——如果需要的话,还可以创建自己的渲染器来添加更多的样式。 这些文章不仅启发了我,我必须承认,我甚至从他们那里窃取了一些想法……但是代码100%是我的! 最后,在完成控制之后,我有了一个完全不同的想法。我甚至不确定我会在我创建它的应用中使用ToggleSwitch。不过,为了让你们都能使用它。 , 控制特性概述 1. 基本控制措施: 这个控件当然是双重缓冲的,以最小化闪烁。它还派生自控件类,因此它同时支持锚和停靠属性。 2. 不同的风格: 我从IKalai的控制和七个风格的WPF控制板。只需将style属性设置为所需的样式即可更改样式。 3.图像和文本支持: 您可以根据自己的喜好定制控件。文本或图像可以插入控件的每一边(如果所选的渲染器支持它)。您只能有文本或图像。如果您已经设置了image属性,那么它将优先,而text属性将不会被使用。 您还可以在按钮本身插入一个图像(同样,如果所选的渲染器支持它)。我没有为滑块按钮实现文本选项,因为我的判断是,可以装进按钮的文本将是如此小,无论如何,它是没有用的。 4. 其他很酷的特性: AllowUserChange——可能在某些情况下,你不希望用户能够改变控件的值,但你也不想禁用它。如果您设置AllowUserChange = false,用户不能更改值,但您仍然可以在后面的代码中更改它。 AnimationInterval AnimationStep和;当滑块从一种状态移动到另一种状态时,它可以被动画化。当UseAnimation = true时,另外两个值决定按钮移动的速度。一般来说,它是移动AnimationStep中设置的像素数来移动AnimationInterval中设置的每毫秒数。如果你想要按钮立即改变状态,只需设置UseAnimation = false。 当控件被禁用时,确定该控件是否以灰度绘制,还是与启用时保持相同的外观。 阈值百分比-决定了在按钮切换到另一边之前你需要拖动的距离。默认值为50%,因此如果您拖动滑块按钮超过控件的一半,它将自动对齐到另一边。百分比总是从按钮当前所在的一侧计算。 ToggleOnButtonClick,ToggleOnSideClick——用户当然可以拖动滑块按钮来改变开关的值。但是使用这些属性,你还可以决定如果用户点击控件,它是否应该切换。如果ToggleOnButtonClick = true,则单击滑块按钮将切换开关。如果ToggleOnSideClick = true,您甚至可以单击按钮旁边的区域,并获得开关切换。如果两个属性都为真,单击控件上的任何位置将切换它,如果两个属性都为假,单击控件将完全没有效果。 5. 可定制的撕裂erers: 每种样式都有自己的渲染器。一些基本属性(比如图像属性)非常常见,可以直接在ToggleSwitch控件上找到它们。不过,并非所有渲染都接受所有这些属性。但大多数都是这样。其他属性,比如颜色,我已经选择附加到特定的渲染器。因为它们都以不同的方式绘制控件,所以很难在ToggleSwitch控件中创建在所有不同场景中都有意义的通用颜色属性。 通过使颜色属性成为渲染器的一部分,就可以定制特定样式的外观。缺点是,为了做到这一点,您必须创建一个新的渲染器实例,更改属性并将新的渲染器分配给控件。但这并不难demo程序会展示如何做到这一点。 在控件的1.1版本中,我在BeforeRendering事件中传递渲染器实例,这样就可以直接设置属性,而无需首先创建一个新实例。 , 的兴趣点 外观我最初想为我的申请是一个拉丝金属把手。我之前看到的所有使用拉丝金属旋钮的控件都是用同样的方法完成的:通过在PhotoShop中嵌入一个在资源中创建的图像文件,然后在控件的表面绘制。我发现了一个PhotoShop教程,关于如何创建这样的图像… 但这让我和我的阿斯伯格综合症感到不安。嵌入一个文件并绘制,不那么“干净”,就像你自己直接绘制控件。 即使使用PhotoShop教程,我也不知道如何用c#绘制它。我在CP上问了一些人,但我并没有得到多少帮助。Pete告诉我,我必须使用渐变笔刷——这我已经知道了,但我真的不知道怎么去做。所以我又用谷歌搜索了一些。我找到了很多关于如何使用PathGradientBrush用径向渐变填充圆的例子。但是所有这些例子都展示了如何创建一个从内圆心到外边界的渐变(或者反过来)。当然,我需要在圆的内部做一个渐变。 这并不容易,但最终,我发现这个例子或多或少做了我需要的: 所以我开始把金属旋钮的图像分割成渐变的饼图切片,然后一个一个的绘制它们。这样就完成了,但奇怪的是,我发现如果我用实际的球形中心作为画笔的中心来绘制所有的渐变,我没有得到我所期望的效果。为了得到正确的效果,我必须稍微偏移每个笔刷的中心位置。我不知道为什么,但我想我最终做到了。 “我的”刷过的金属把手看起来可能没有ps过的那么好,但我对结果还是很满意的。这样我就不必在控件库中包含资源来让它工作了。 , 历史 版本1.1 (2019-02-20) 新:BeforeRendering事件添加,使其更容易自定义渲染器属性 新:风格和渲染添加:朴素和简单 更新:演示应用程序更新了新的功能 版本1.0 (2015-09-11) 最初版本 本文转载于:http://www.diyabc.com/frontweb/news451.html

posted @ 2020-08-07 02:55  Dincat  阅读(469)  评论(0编辑  收藏  举报