Menu Strip usercontrol that adds items to form at design time - c#

My goal is to emulate the Smart tag already on the menustrip in visual studio that inserts the common menu items.
I'd like to have the user be able to select the item they want from a drop down (I have that already using a UITypeEditor) and then have the items created just like they normally would be at design time (part of the form's components with their creation code in the .Designer.cs file).
The best I have been able to do is to have the menustrip control create the items and add them to it's Items collection. The problem is that the items can't be manipulated further at design time. The menu containing them is actually 'locked'. For the user to add more buttons they would have to do it dynamically at run time.
Is my goal possible and if so could some one point me in the right direction?

I'm not positive, but I think you need to interact with the IComponentChangedService and inform it that your menu has changed. It's been a while since I've written design time support for controls.
In your designer:
IComponentChangeService changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
Actually
I think it is the DesignHost you need check out this:
IDesignerHost designHost = (IDesignerHost)GetService(typeof(IDesignerHost));
designHost.Container.Add(...)
I believe you have to add your component to it to manage it.

Related

How to do non-linear page navigation in WPF & C#?

I'm not even sure if I'm using the right terms for what I'm trying to do. But basically I have a personal organizer program with content that changes depending on what task you're doing, a calendar vs. contact list vs. todo list etc.
My searches keep bringing up "Navigation" but I'm not sure that this is what I'm after, as I don't want to be stuck going forwards and backwards between pages. I want the user to be able to click on a link or button and be able to jump to any point in the program. Am I better off just removing all the controls and adding the new ones each time? I'd like to keep it all within one window if possible.
If I were in your situation, I would use tabs. Set up an individual tab for each each "task" (calender, contact list, todo list). This way users are one click away from any task they want to navigate to.
You want to use user controls. Each user control is like a sub-page of controls. Then you keep the same master page and just switch user controls based on what you want to show. You can put the user controls on separate tabs if you like or you can put them one after the other and make them visible/invisible or you can load them dynamically with code like
myBorder.Child = new MyUserControl();

How to add to ContextMenuStrip and ToolStrip same ToolStripButtons?

I have tool bar in my app and context menu with the same options, so I want to
add ToolStripButtons to both ContextMenuStrip and ToolStrip, unfortunately I can't do this.
Even when I add manually items to both it shows only on one.
For now I have buttons in tool bar:
I want something like this. I want this options to be one, because I will be often enable and disable this buttons and finally there is one option so why two buttons?
This is a common problem and I've found the easiest solution is to place the 'shared' code inside a MenuFeature class that inherits from ToolStripMenuItem.
You still have to create 2 instances of this class, but each instance is very lightweight and only has code for any differences between the 2 usages (i.e. the ContextMenu item might use ToolStripItemDisplayStyle.ImageAndText, while the ToolStrip item might use ToolStripItemDisplayStyle.Image).
This allows common code to exist only once inside your custom MenuFeature class, but still allows changes local to each usage of this menu item.
If you wanted to automatically synchronize properties like Enabled/Visible/etc, you could maintain a static collection of all instances inside the constructor, and then update all the items using events like EnabledChanged/etc. I would recommend against this, however, as I've found different instances of the same menu 'feature' often need their own state - but this is getting out of scope on this Question, those interested in how I've managed items can comment on this answer or PM me.

C# WinForms add controls programmatically

Can someone suggest the best way to achieve my goal?
So, I have a form with three buttons. What I want is, depending on what button is pressed on panel should be shown different controls (user control). I made this in a simple way: all are added from the beginning, I just make change to the visibility. But what would be nice is, if someone can suggest a more appropriate way, because there is no need to have objects created from beginning.
You can always create the appropriate UserControl, and add it to the Panel.Controls at runtime. This will allow you to create the control(s) as needed, instead of on initialization of your Form.
I would indeed create the controls at design time - if there's advantage no to dynamically create them. Why complicate matters?
If there are a number of controls I would put them all in a panel (within the panel you've already mentioned) so you're only changing the visibility of a single control (the panel) rather than each one within it.
When you press the appropriate button show the appropriate panel (and remember to hide the others in case you've previously shown them)

Managing Lots of Overlapping Controls in Visual Studio

I'm using different sets of controls on the same location on a form. By default all are visible=false and then certain subsets of the controls are set to visible as the user selects specific values in a combobox dropdown control.
From the user's perspective this works well since they only see the controls that are needed.
However, since the controls occupy the same location on the form it is difficult to manage these in Visual Studio design view.
Is there a way to group sets of these overlapping controls in Visual Studio so that I can select the entire subset of controls quickly and easily? Is there a way to hide certain controls in design view? Right now everything is stacked on top of each other when developing so it makes managing these controls difficult.
To get such a beast to work i would put every group into it's own UserControl. On your MainForm you stack all these UserControls above each other.
So at the MainForm you can't really get a good overview, but now you got for every group your individual designer view and in your main form you can hide the complete group by a single line of code userControl.Visible = false.
A TabControl can do this, works well in design mode. You just need to hide the tabs at runtime. Check my code in this thread.
You can not hide them.
However you can group them in group box
and using "Bring to front" and "Send to back" property deal with them.
First of all,
If you work with multiple components in same location, you can use groupboxes in your form. Then, to superimpose these groupboxes, you should edit each of your groupboxes on different place in your form screen. After the edit, you should input size and location data manually in your groupbox properties menu.
If you want to edit one of your groupbox after the set location, you can easily right click any of your groupboxes then click "send to back" and "bring in front" commands. I hope it helps.

Creating Options Menu with overlapping panels

I'm trying to create an options menu in a C# forms project, and I'm curious if there's a less ugly way to do this. I have a ListBox that has the different categories of options, and when you select a category, the options for that category appear in a panel on the right. Basically, something identical to the options menu in Visual Studio itself.
Obviously, different controls have to use the same real estate here, as every category has different options which need to be displayed in the same area of my form. So when you select a category, the controls for every other category must become hidden.
I'm currently using a different Panel object for each category (13 currently), but designing each panel is a headache because i need to drag the other 12 panels out of the way each time I need to alter one. Is there a better way to do this? I'm open to any suggestions, whether its a complete change in the implementation, or even just a Visual Studio tip for working with 1 of 13 panels that all overlap.
If all else fails I could use a TabControl rendered horizontally, but I don't like how that looks.
Thanks in advance.
I can think of three alternate approaches:
(Ok) Use a tab control that doesn't display the headers for the user.
(Better) Create user controls for each option page, so you have different designer files for each.
(Better yet?) Dynamically generate the UI based on some descriptive information, so there are no designer files to deal with at all.
Take a look at the UserControl class. You can design on it with the Forms Designer, than programatically place it to the right of your ListBox when items are selected. Create a different UserControl for each category of options that you have.
First you should know when you are in Design Mode that there is a drop down menu from the Properties Windows (View->Prpoerties Menu), that allows you to select a control. So you don't need to move other controls out of the way encesarily.
Second, I would make the options panel for each category it's own user or custom control. This way you can edit the panel itself seperately. Then you have the option of showing/hiding that custom control when it's category is selected, or even dynamically creating the control.

Categories