Short version: VB.Net Windows forms feature controls that are often dragged from the toolbox onto the form. The code for the control goes right into the form. Usually this is great, but is it possible to write the code for a UI control (like a panel) into a separate file which can then be imported or otherwise included into the main Form Class?
Context (a.k.a. long version): I have a form with an unchanging column of navigation buttons on the left hand side. The rest of the form is taken up by different panels, which in turn have different controls of their own. Clicking the different buttons on the left should cause these different panels to appear (clicking button "A" brings up panel "A"; button "B" brings up panel "B", etc.), but the left-hand menu should stay unchanged.
I'm having a hard time implementing this design in an elegant way in VB.Net. If I make each panel a separate Form, I have to duplicate the code that builds the unchanging left-hand menu in every file, which is terrible. I tried using inherited forms so the separate panels would inherit the left-hand menu from a master form, but that means each click on the menu sprouts the new form in a new window, and although the left-hand menu is inherited, the menu that I clicked and the identical-looking menu in the new window are not the same objects in memory and have no knowledge of each other.
I just want one window with central content that changes based on what you click on the left-hand side. A solution to this would be for the panels to be just that - panels - and not separate forms as I'm currently doing it. But this gets messy organizationally because the code for all of the panels has to be in the one massive master file. Hence the short form of my question (see above): How can I code a panel in a separate file and then bring it into the fold of the main form?
It sounds to me like you want to use usercontrols. Create a usercontrol for each of the four things you want and then add those to a panel, making each one visible or invisible according to which button was pressed.
Related
I created an interface it has several forms you can switch between using a panel as the parent form. My problem is that when i switch between my forms on the second time i open a form if that form has autoscroll on a panel it will not allow you to scroll and the window is stuck on the view you previously had.
In this image i open the form internet. after doing so i will click on instruction( any form switch triggers this)
now i open the same form again and the scroll bar is gone and it locks in on the last position the form was in.
the very curious thing in this is that this only happens on the internet form word also has a scroll bar however even though the properties and settings for both are identical only one does not work.
What could be causing this and how do i go about troubleshooting errors like this.
The forms are removed from the panel and re-added, they are not closed.
Assumption 0:
The forms are removed from the panel and re-added, they are not
closed.
Store the state of panel autoscroll and set it after you have re-added it. Note that if you add controls to the panel first and panel is not docked, then scroll will not appear because panel dimensions can be huge. You should set following property as well:
vScrollBar1.Vericalscroll.Value = 0
Assumption 1:
I assume what is actually going on is that you do not add controls to that panel, but to the form behind it or something similar. In that case - program is correct, you just asked it to do a wrong thing.
Assumption 2:
Assuming is panel is anchored top, left, bottom, right. There is currently a limitation in Windows Forms that prevents all classes derived from ScrollableControl from acting properly when both RightToLeft is enabled and AutoScroll is set to True.
Manual : link
Assumption 3:
You add the controls back, by recreating them, but forget to add handlers or create them in order where scrollbar is out of view. Instead of absolute positions you could use dockstyle:
Dim vScrollBar1 As VScrollBar = New VScrollBar
vScrollBar1.Dock = DockStyle.Right
Controls.Add(vScrollBar1)
I am overlaying a bunch of panels on top of one another. I want to be able to click a button to display which ever panel is in the stack referred to by unique names (panel1, panel2...).
However, the bottom panel some how is always the parent of whoever is on top of it. Therefore, If I were to set the visibility of the bottom panel to false, then nothing on top of the bottom panel can be made visible.
How do I make these overlayed panels independent to each other instead of having a parent-child relationship?
I faced the same situation a time ago. The more pragmatic way that I found was to use a tab control and hide/show tabs accordingly. It is possible to get rid of the label of the tab, so users dont even know about its existence. The rule is to have one and only one tab visible in any given time.
I'd like to know how I can make a side panel which when collapsed only shows a button that upon click will be pushed out by an expanded area which contains a control of choice. Clicking the button again will collapse the expanded area and the only thing you'll see is the button at the edge of the screen again.
I don't have any good examples of something similar so I hope you understand what I mean.
in toolbox there is a control called Expander, which is exactly for that purpose
Im building a game with VB.NET
I designed the core of the game in form1 window
But now I need menus. How can I implement this without having 5 or so windows that I show() and hide() ? Doing that slows it down a lot and uses lots of memory. I tried tabs, but I don't want the tabs to appear, just switch. Whats the best way to implement multiple interfaces?
Thanks
You can have one menustrip with all toolstripmenuitems for all five menus.
Make all the toolstripmenuitems invisible (.visible = false) except for those for the "current menu." When you make a toolstripmenuitem invisible, all its subitems also disappear and that menu item is inaccessible.
When you change "menus", you can make another set of toolstripmenuitems visible. You'll only have one menu, but you can make it look like you have 5.
I have a cocoa app with two types windows each of which requires a different main menu to be displayed.
In my MainMenu.xib I have the default MainMenu. In Window1.xib I have Window1 and in Window2.xib I have Window2 and it's MainMenu.
When I have the first Window open I have the default Menu, when I open Window2 I get it's menu.
However, when I switch back to Window1 I still see Window2's menu. How do I make the menu that is displayed follow the key window?
Generally, you shouldn't replace the entire main menu every time. It's more compliant with the Human Interface Guidelines to simply disable any menu items that don't apply to the current window. And if you really should have a completely different set of menus in the menu bar, maybe you should split that part of your application into a separate application.
NSApplication has a method, - (void)setMainMenu:(NSMenu *)aMenu. You can pass it a reference to the correct menu in the appropriate window controller, by implementing - (void)windowDidBecomeKey:(NSNotification *)notification.
Keep in mind it may be easier to change just the submenus instead of swapping out the entire main menu, since you won't have to maintain two different copies of the application, help, and other menus that won't change between the two windows.