开发者

How to implement a-form-inside-a-form with runtime embedded forms switching?

I need to implement TabControl-like behaviour with manual (on event, on a button click for example) pages switching and having all pages designed and implemented as separate forms. A form to be incorporated (as a panel control) inside main form and replaced by another form as needed.

How to achieve this?

PS: The reason why I don't want to use TabControl instead is because there are going to be too many tabs - I'd prefer to present the list of them as a TreeView and instantiate on demand. The another reason comes from another project of mine 开发者_开发问答- there I am going to implement plug-ins, where a panel inside main window will be provided by a class loaded dynamically and will be runtime-switchable.


I need to implement TabControl-like behaviour with manual (on event, on a button click for example) pages switching and having all pages designed and implemented as separate forms

May I ask why this is a requirement? It seems like the logical approach would be to create a set of UserControls. You can place a UserControl in a form, and you can place a UserControl in a tab. You get modularity without the headache of implementing a very odd requirement which is a use case that the API developers obviously did not think was valid. I just can't think of a good reason to take the route you have suggested.


I did similar thing once, and for that reason, I have ReplaceControl method, which I paste below:

    static public void ReplaceControl(Control ToReplace, Form ReplaceWith) {
        ReplaceWith.TopLevel=false;
        ReplaceWith.FormBorderStyle=FormBorderStyle.None;
        ReplaceWith.Show();
        ReplaceWith.Anchor=ToReplace.Anchor;
        ReplaceWith.Dock=ToReplace.Dock;
        ReplaceWith.Font=ToReplace.Font;
        ReplaceWith.Size=ToReplace.Size;
        ReplaceWith.Location=ToReplace.Location;
        ToReplace.Parent.Controls.Add(ReplaceWith);
        ToReplace.Visible=false;
    }

Only thing left to do is to create some control manually on the form, as the placeholder for your Form. Use label, for example.


You could do this with an MDIForm as the main form, and then plain-old Forms as the separate forms. Or you could encapsulate each element's functionality as a UserControl which you can then swap out on your form in code.

The advantage of encapsulating your UI elements as UserControls is that if, for whatever reason, you need them to become forms in your application, you can just drop the UserControl on a form.

Update: Since you want to use a TreeView to select what the user is looking at, you definitely want to do this as a bunch of UserControls. The layout is simple: TreeView on the left, and whichever control is active on the right.

There's no need to justify not using a TabControl - tabs are the worst UI element in history.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜