在Winform中访问用户控件的控件属性的正确方法是什么?

3

我创建了这个用户控件:

enter image description here

我把这个用户控件添加到主窗体中,现在我想要自定义它。 所以我需要给这三个按钮添加文本,在标签中填充文本框,并为按钮设置点击事件。

正确的方法是什么?

我在网上找了一些资料,似乎应该在用户控件中添加公共属性,以便暴露出我需要的单个控件属性。

像这样:

    public string Button1Text
    {
        get
        {
            return btn1.Text;
        }
        set
        {
            btn1.Text = value;
        }
    }

如果我选择这种方式,我会需要在这个简单的用户控件中添加相当多的公共属性。
但是直接将整个控件暴露在用户控件中不是更简单吗?
    public Button MyButton1
    {
        get { return this.btn1; }
        set { this.btn1 = value; }
    }

那样主窗体就可以根据需要简单地访问控件及其属性。
3个回答

3

从封装的角度来看,第一种方法更好。第二种方法会导致您控件的用户(表单)依赖于您控件的视图,这将阻止未来对视图的更改。


但是,例如 ListBox 比简单的 TextBox 更复杂,该怎么办呢?它有许多属性,我想要访问,如 DataSource、DisplayMember、Items、SelectedIndex、SelectedItem、SelectedItems、SelectedValue 等等。我应该暴露每个属性吗?如果是这样,那么这与第二种方法有什么不同呢?在两种情况下,表单都与 ListBox 相关联。还是应该以不同的方式封装? - user850010
我认为,你以这种方式导出属性越多,就会创建更多的依赖关系。尝试抽象化处理。此外,我建议你学习WPF并遵循MVVM(Model-View-ViewModel)指令。 - tech-man

2

第一段代码是正确的做法。你需要创建很多这样的代码,但这是正确的做法。


1

第一种方法更好,您只需为希望从父控件访问的每个单独按钮属性创建属性。

如果您使用第二种方法,则任何希望使用您的控件的人都将能够移动和调整控件内的单个控件。那么它就不再是自定义控件,而更像是一个比面板更难使用的面板。我想不出任何原因可以允许父级控件移动子控件中的单个元素。


我在问题中创建了用户控件,因为我需要在应用程序的几个地方使用这些控件组,所以对我来说创建空白用户控件并使主窗体可以访问其子控件是有意义的。 - user850010

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接