首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将控件从用户控件移动到面板控件

将控件从用户控件移动到面板控件
EN

Stack Overflow用户
提问于 2012-08-31 09:22:49
回答 1查看 1.9K关注 0票数 0

我正在尝试编写一个窗体主题类库,以便以一种简单的方式为我将要处理的任何项目调整窗体布局。

这基本上是它应该是什么样子的一个想法:

http://www.beaverdistrict.nl/form_layout.png

从本质上讲,插件的工作原理如下:

代码语言:javascript
复制
// form class, which inherits the plugin class
class FormToTheme : ThemedForm
{
    public FormToTheme()
    {
        // some code here
    }
}

// plugin class itself
class ThemedForm: Form
{
    public ThemedForm()
    {
        // some code here
    }
}

基本上,我将FormBorderStyle设置为None,并通过代码绘制布局。

但是现在,添加的控件可以放在自定义标题栏上,如果你保留默认的FormBorderStyle,这在正常的表单中是不可能的。所以我想我可以通过自动将控件添加到内容面板而不是用户控件来解决这个问题。

所以我试着这样做:

代码语言:javascript
复制
private void ThemedForm_ControlAdded(Object sender, ControlEventArgs e)
{
    // some simple code to set the control to the current theme I'm using
    e.Control.BackColor = Color.FromArgb(66, 66, 66);
    e.Control.ForeColor = Color.White;

    // the code where I try to place the control in the contentPanel controls array, 
    // and remove it from it's parent's controls array.
    if (e.Control.Name != contentPanel.Name)
    {
        e.Control.Parent.Controls.Remove(e.Control);
        contentPanel.Controls.Add(e.Control);
    }
}

但是当我试图在主窗体和可视化编辑器中添加一个新控件时,我得到了以下错误:

代码语言:javascript
复制
child is not a child control of this parent

所以我的问题是:有没有办法解决这个错误,并将控件从用户控件移动到内容面板?

请注意,我确实希望在ThemedForm类中自动执行此操作,而不是从主窗体调用方法。

编辑:

我试过这个:

http://forums.asp.net/t/617980.aspx

但这只会导致visual studio冻结,然后我需要重新启动。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-31 13:25:21

我知道回答自己的问题是不合适的,但是我提出的解决方案需要相当多的解释,这将是太多的编辑我的问题。

所以我们开始吧:

在继承的'ThemedForm‘类中,我创建了一个私有变量,以便在调用控件属性时能够返回该变量:

代码语言:javascript
复制
private Controls controls = null;

我将变量设置为null,因为我需要将变量传递给'ThemedForm‘类构造函数中的类。稍后我将创建该类的一个新实例。

然后我创建了一个类来替换Controls属性:

代码语言:javascript
复制
public class Controls
{
    private Control contentPanel = null;
    private ThemedForm themedform = null;
    public Controls(ThemedForm form, Control panel)
    {
        contentPanel = panel;
        themedform = form;
    }
    public void Add(Control control)
    {
        if (control != contentPanel)
        {
            contentPanel.Controls.Add(control);
        }
        else
        {
            themedform.Controls_Add(control);
        }
    }
    public void Remove(Control control)
    {
        if (control != contentPanel)
        {
            contentPanel.Controls.Remove(control);
        }
        else
        {
            themedform.Controls_Remove(control);
        }
    }
}

我知道这个类与原始控件属性的所有功能相去甚远,但现在必须这样做,如果你愿意,你可以添加你自己的功能。

正如您在Controls类的Add和Remove方法中看到的那样,我尝试确定需要添加的控件是我想要将其余控件添加到的内容面板,还是需要添加到内容面板的任何其他控件。

如果控件实际上是内容面板,我会将它添加到'ThemedForm‘类的基类的Controls属性中或从中删除它,该类是一个'Form’类。否则,我只需将该控件添加到内容面板的Controls属性。

然后,我将Controls_Add和Controls_Remove方法添加到'ThemedForm‘类中,以便能够在'ThemedForm’基类的Controls属性中添加或删除控件。

代码语言:javascript
复制
public void Controls_Add(Control control)
{
    base.Controls.Add(control);
}
public void Controls_Remove(Control control)
{
    base.Controls.Remove(control);
}

它们是不言自明的。

为了从外部类调用Controls.Add或Controls.Remove方法,我需要添加一个公共属性来隐藏当前控件属性,并返回我分配给替换类的私有变量。

代码语言:javascript
复制
new public Controls Controls
{
    get { return controls; }
}

最后,我创建了Controls类的一个新实例,传递了当前的“ThemedForm”类和contentPanel控件,以使其全部运行。

代码语言:javascript
复制
_controls = new Controls(this, contentPanel);

在完成所有这些工作之后,我能够将添加到UserControl (甚至在可视化编辑器中)的任何控件“重定向”到内容面板。这允许我使用任何控件的Dock属性,并且它将停靠在内容面板内,而不是停靠在整个窗体上。

这仍然有一点but,因为在可视化编辑器中,停靠的控件仍然看起来像是停靠在整个窗体上,但当运行应用程序时,结果是我想要的。

我真的希望这对任何人都有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12207762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档