首次放置在表单上时如何获取要遵守的 WinForms 自定义控件的默认值

     2023-04-12     290

关键词:

【中文标题】首次放置在表单上时如何获取要遵守的 WinForms 自定义控件的默认值【英文标题】:How to get WinForms custom control's default value to be respected when first dropped on a form 【发布时间】:2018-06-29 00:33:04 【问题描述】:

我有一个包含自定义控件的类库:

using System.ComponentModel;
using System.Windows.Forms;

namespace ClassLibrary1

    public sealed class CustomLabel : Label
    
        [DefaultValue(false), Browsable(false), EditorBrowsable(EditorBrowsableState.Never), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public override bool AutoSize
        
            get => base.AutoSize;
            set => base.AutoSize = value;
        

        public CustomLabel()
        
            AutoSize = false;
        
    

注意AutoSize 在构造函数被覆盖方法的设计器属性中都设置为false。

我有一个要在其中使用控件的 winforms 项目。我从工具箱中拖放它,但它没有将 AutoSize 设置为 false:

如果我保存并关闭表单然后重新打开它,现在它已正确设置:

如何让它在第一次放在表单上时尊重属性值?

【问题讨论】:

可能与 DesignMode 属性有关吗?当您测试该属性时,我会看看是否有什么变化。 ***.com/questions/336817/… DesignMode属性无关,与设计师有关。这是因为AutoSizeToolboxItemCreateComponentsCore 方法设置为Label 的ToolboxItem 我还应该补充一点,CreateComponentCore 方法只会在您将组件从工具箱拖放到设计图面时运行。它描述了为什么在将它放到表单上之后,它会自动调整大小,因为它是在构造函数之后由 CreateComponentCore 设置的。但是,在您再次打开表单后,这一次,您的构造函数将运行并将属性设置为 false。 【参考方案1】:

您在构造函数中分配的默认值通常会受到尊重。但在某些情况下,默认值会使用设计器进行更改,例如通过控件的ToolboxItemCreateComponentsCore 方法。

LabelAutoSize 属性的默认值为false,您甚至不需要覆盖它或在构造函数中设置它。 但是AutoSizeToolboxItem 已分配给Label,当您将Label 的实例放在设计器上时,它会将AutoSize 设置为true。要删除此行为,只需为您的控件分配一个新的ToolboxItem即可:

using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;

namespace ClassLibrary1

    [ToolboxItem(typeof(ToolboxItem))]
    public sealed class CustomLabel : Label
    
    

注意 1:仅供参考,ToolboxItem 有一个 CreateComponentsCore 方法,当您在设计图面上放下控制时,您可以使用它来执行一些初始化任务。

注意 2 我还应该补充一点,CreateComponentCore 方法只会在您将组件从工具箱拖放到设计图面时运行。它描述了为什么在将它放到表单上之后,它会自动调整大小,因为它是由 CreateComponentCore 在您的构造函数之后设置的。但在你再次打开表单后,这一次,你的构造函数将运行并将属性设置为 false。

【讨论】:

【参考方案2】:

DefaultValueAttribute 与它无关:它主要控制属性值是否应该序列化,以及该值是否应该在属性编辑器窗口中以粗体显示。

如果您查看设计器代码,最初它会被明确地写出,并将 AutoSize 保存为 true。显然它保存了该值,因为它与DefaultValue 指定的值不匹配,但它保存了错误的值——显然基础控件还没有得到更新。任何更改都会导致它再次序列化表单,这次使用正确的值。

我不知道为什么某些属性不喜欢被构造函数覆盖和更改,但有一些属性不会立即使用。 AutoSize 是通过 SetStyle 调用和/或通过一些 CommonProperties 助手处理的。

设置其中一些的一种方法是实现ISupportInitialize 以在从设计器属性设置控件后设置值。更简单的方法是覆盖OnHandleCreated

protected override void OnHandleCreated(EventArgs e)

    base.OnHandleCreated(e);
    base.AutoSize = false;

似乎可以按预期工作。

【讨论】:

虽然您的解决方案是有效的,但您应该知道您在构造函数中分配的默认值通常会受到尊重。但在某些情况下,默认值将使用设计器进行更改,例如通过控件的ToolboxItemCreateComponentsCore 方法。 AutoSize 属性是受AutoSizeToolboxItem 影响的情况之一。

当按钮放置在节页眉/页脚上时,iOS 14 上出现奇怪的 UI 渲染问题

】当按钮放置在节页眉/页脚上时,iOS14上出现奇怪的UI渲染问题【英文标题】:StrangeUIrenderingproblemoniOS14whenabuttonisplacedonasectionheader/footer【发布时间】:2020-10-0300:53:41【问题描述】:在下面的示例代码中,一个按钮放置在(表单... 查看详情

当原点不在网格上时,如何将网格/游戏对象放置在相机的 FoV 中间?

】当原点不在网格上时,如何将网格/游戏对象放置在相机的FoV中间?【英文标题】:HowtoplaceaMesh/gameObjectinthemiddleofthecamera\'sFoVwhentheoriginisnotonthemesh?【发布时间】:2021-07-2115:30:12【问题描述】:我正在制作一个Unity游戏,我需要... 查看详情

请教:在winform中如何获取所有控件集合

在winform中控件是一种 树类型的结构,根节点是窗体,与treeview类似要获取所有的控制需要用递归函数遍历所有控件参考技术Acontrol.Controls 参考技术B什么喜欢孩童(儿童) 查看详情

为啥我的视图在 swiftUI 中首次出现在屏幕上时没有转换

】为啥我的视图在swiftUI中首次出现在屏幕上时没有转换【英文标题】:WhyismyviewnottransitioningwhenfirstappearedonscreeninswiftUI为什么我的视图在swiftUI中首次出现在屏幕上时没有转换【发布时间】:2020-07-0410:29:03【问题描述】:我想要一... 查看详情

在 React 中提交表单时如何获取要显示的名称和 uuid

】在React中提交表单时如何获取要显示的名称和uuid【英文标题】:HowdoIgetthenameanduuidtodisplaywhentheformissubmittedinReact【发布时间】:2022-01-1508:58:56【问题描述】:我正在尝试创建一个Web应用程序,该应用程序将具有一个用于收集名... 查看详情

如何获取表单程序的参数?

...程序呢?【问题讨论】:【参考方案1】:当您在C#中创建WinForm应用程序时,编辑器会为您创建一个Program.cs文件。这是main所在的位置,也是参数可用的位置。由于缺乏更好的术语,这有点IDE“魔法”。仍然有一个“主要 查看详情

放置在白色背景上时,UIVisualEffectView“消失”

】放置在白色背景上时,UIVisualEffectView“消失”【英文标题】:UIVisualEffectView\'disappears\'whenplacedagainstawhitebackground【发布时间】:2018-09-1120:32:38【问题描述】:我正在尝试重新创建一个类似于AppStore故事页脚中使用的UIVisualEffectVie... 查看详情

winform的页面怎么判断页面首次加载,在线等待!谢谢了!

参考技术A在winform的启动项目里写一个变量向文件或者注册表中写一个数据。并且每次启动的时候都判断这个变量是否存在,如果存在则说明程序不是第一次运行,因为之前写过这个文件了。当然,你卸载程序的时候也要卸载掉... 查看详情

如何制作winform中自定义进度条

参考技术A先在窗体上面放置一个DualProgressBar,这个类型的滚动条需要4个Painter去描绘,,所以可以再分别在窗体上面选择对应类型的Painter,然后分别设置好Painter的属性,主要是颜色类和样式类,有的还涉及到二种颜色,有的样... 查看详情

当我移动并将其放置在运行时的另一个图片框上时,如何避免图片框消失?(代码片段)

我测试了这个网页中用于在运行时移动图片框的代码:http://www.davidsuarez.es/2007/11/mover-y-soltar-controles-con-drag-drop-visual-basic/我创建了一个带有两个pictureboxex的Form:Picture1和Picture2(页面是西班牙语,所以我在这里复制修改后的代码... 查看详情

如何在录制以显示在屏幕上时获取 AVCaptureMovieFileOutput 的当前长度?

】如何在录制以显示在屏幕上时获取AVCaptureMovieFileOutput的当前长度?【英文标题】:HowtogetcurrentlengthofAVCaptureMovieFileOutputwhilerecordingtodisplayonscreen?【发布时间】:2016-07-1818:33:02【问题描述】:正如标题所说,我希望在用户使用AVFou... 查看详情

将 Flash 层放置在元素上时保留 CSS 动画

】将Flash层放置在元素上时保留CSS动画【英文标题】:KeepCSSanimationwhenaFlashlayerisplacedoverelement【发布时间】:2017-01-0412:16:09【问题描述】:我正在使用ZeroClipboard库,因为它支持safari,而其他软件包,例如clipboard.js则不支持。ZeroCli... 查看详情

如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?

】如何将winform子表单动态嵌入到主winform的选项卡控件中?【英文标题】:HowdoIdynamicallyembedawinformsubformintothetabcontrolofamainwinform?【发布时间】:2011-05-1915:08:46【问题描述】:有没有一种方法可以将Winforms表单对象交给包含选项卡... 查看详情

放置在 SurfaceView 上时,VideoView 在 FrameLayout 中不可见

】放置在SurfaceView上时,VideoView在FrameLayout中不可见【英文标题】:VideoViewnotvisibleinFrameLayoutwhenplacedoveraSurfaceView【发布时间】:2015-10-0900:14:19【问题描述】:我的VideoView似乎只有当它是我的FrameLayout的唯一孩子时才可见。当有第... 查看详情

如何创建特定类型的用户控件

...创建一个winForms用户控件。但我想要一个用户控件——当放置在表单上时——不占用任何表单空间。相反,它像OpenFileDialog一样很好地隐藏在下方。首先,这是什么用户创造的东西?它仍然称为“用户控件”吗?如果不是,这可... 查看详情

放置在 Listview 上时,Android Searchview 不会触发

】放置在Listview上时,AndroidSearchview不会触发【英文标题】:AndroidSearchviewnotfiringwhenplacedoverListview【发布时间】:2021-01-1207:33:55【问题描述】:我已经环顾了好几个小时,我发现这个主题要么是4年前,要么是使用EditText,要么是... 查看详情

如何在 Winforms 中显示“正在加载...请稍候”消息以获取长加载表单?

...:50:14【问题描述】:我有一个非常慢的表单,因为表单上放置了许多控件。因此,表单需要很长时间才能加载。如何先加载表单,然后显示它,并在加载延迟时显示 查看详情

如何在 Flask 中获取已提交表单的名称?

】如何在Flask中获取已提交表单的名称?【英文标题】:HowtogetthenameofasubmittedforminFlask?【发布时间】:2014-11-3019:18:01【问题描述】:我正在使用Flask构建一个网站,在一个页面上我有两个表单。如果有POST,我需要决定要发布哪个... 查看详情