【问题标题】:How can I edit the properties of a button in a form, where the button is on a custom user control?如何编辑表单中按钮的属性,其中按钮位于自定义用户控件上?
【发布时间】:2011-08-05 19:56:21
【问题描述】:
我有一个自定义用户控件,我在其上放置了一个按钮控件。我将按钮的访问修饰符设置为 Public。当我将用户控件放到表单上时,我看到了该按钮,但无法在表单设计器中选择它或编辑其属性。
最后,我想创建一个更复杂的自定义向导控件,带有内容面板、“返回”和“下一步”按钮等。我已经成功创建了一个内容面板,可以在设计时将控件放入其中在主窗体上。
但是,我无法在用户控件本身上编辑嵌套控件。
从用户控件或表单继承时,通常可以编辑访问修饰符设置为“受保护”的控件的属性。
我需要做什么才能从表单设计者访问自定义用户控件的控件?
【问题讨论】:
标签:
c#
winforms
user-controls
designer
【解决方案1】:
我认为您需要转到用户控件设计器视图来修改按钮的属性(而不是放置用户控件的表单),因为它嵌套在用户控件中。
【解决方案2】:
您可以对表单上用户控件的子控件进行基本更改,但您可以通过父用户控件设计器公开感兴趣的属性并支持在设计时更改属性。您可以通过编写自己的自定义设计器来制作更复杂的设计时行为,但这可能是一项非常困难的工作。
它没有按照您认为可以而且应该的方式工作是有充分理由的,如果您仔细考虑一段时间,您就会明白为什么。当您从一个对象继承时,您可以更改属性等,但在这种情况下您正在创建一个新的类型,因此您可以修改、添加、重新定义属性。
但是,当您将用户控件拖放到表单上时,您并没有创建新类型。您正在创建一个类型的 instance,即用户控件,它已经定义。在您可以修改属性的范围内,您正在修改必须为该实例保留的状态。状态不仅必须持久化,而且用户控件还经常涉及绘画等,因此状态变化也会产生复杂的行为影响,这是一个潜在的复杂需求,无法完全概括。
所以有些修改根本不可能,因为它们意味着修改类型,而你已经有了一个类型,你只是在创建一个实例。对于最终基于状态的其余可能修改范围,该平台仅支持全部可能的状态管理。