I have a TextBox which has some default context menu and it works fine. For some "user friendly" approach I want to have same functionality of Cut/Copy/Paste in the main menu, but for that items I have just an event and I need to implement Cut/Copy/Paste functionality myself. Even if I do my best, I might not cover every possible case to keep my version and default context menu's version of clipboard functionality identical.
First I tried to reach this context menu on my main menu event and fire context menu item's event accordingly, but I TextBox.ContextMenu is null...
Any suggestions how to "link" main menu's functionality to the default context menu's functionality?
The TextBox class has Cut, Copy and Paste methods. When the user selects Cut, Copy or Paste from your menu, and your TextBox has focus, you can invoke the corresponding method of your TextBox.
MSDN has sample code:
http://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.paste(v=VS.110).aspx
Related
Inheriting from ListView control for WinForms and I would like to display a context menu when a item is selected and a totally different one when there is none.
This approach seems straight forward and I saw lots of examples that basically listen to the right click event and upon that decide which context to show and force it to show at cursor location.
What I am looking for if there is a more efficient / native method of doing it rather than listening to the right click event, for starters it will not work if you try to open the context from the keyboard (either shift+F10 or with context key). Plus, if you are using keyboard to navigate the listview and your cursor is elsewhere then it looks horrible. On top of that the menu should be shown on mouseUp and not mouseDown which make it a bit more complicated.
I was looking for an event of the base control class that would handle the "onContextInvoked" or similar, even onContextOpening but at the control level not the context menu level.
Anyone has a better feedback/solution/approach to this?, or I just have to deal with mouse/key events and force to show a context which is not actually bounded to the control itself?
One idea I had is to always use one context menu as normal and then on the opening event of that one check if items are selected and if not try to cancel that context and open the other one on that very same position, but I haven't tried it yet.
I have an empty listbox which I would like to allow the user to paste items into. Currently I make sure the listbox has focus (as per WPF: How to enable a Command?) when the user clicks on it. Then if they right-click the context menu which contains the Paste command will be enabled and can be clicked which is excellent. However if instead of right-clicking the user presses CTRL+V on the keyboard the Paste command does not execute.
So far I can't figure out how to make this work. If the listbox has items in it and one of them is selected everything works fine.
Thanks
Add your own CommandBinding for the Paste-Command to the ListBox.
m_yourlistBoxReference.CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste,YourExecutedHandler,YourCanExecuteHandler));
However, such as you already wrote, you have to ensure that the ListBox is focused, otherwise the CommandBinding will not execute. To ensure this, you can register to the PreviewMouseDown-event and focus the ListBox if not already IsFocused is true.
I'm not a WPF expert; however, in WinForms the easiest way is to add a context menu with the short-cut keys for Cut, Copy, Paste, etc. Then you don't have to do anything but implement the context menu click.
In my application I have dropdown list with several items. I'd like to show a context menu when the user clicks the right mouse button on a dropdown item. Is this possible? And if it is possible, how?
It is possible but not easy. The ComboBox dropdown is a native ListBox that is created on-the-fly. To get the handle of that list box, you have to send the CB_GETCOMBOBOXINFO message in the DropDown event. Check my answer in this thread to find out how to do this.
The iceberg that is likely to sink that Titanic is that the dropdown automatically closes as soon as it loses focus. Which will happen as soon as you display the context menu. Nothing you can do about that.
Consider a different approach, you could use an actual ListBox that you make visible when the user clicks a glyph that looks like an arrow next a TextBox.
Not possible easily. No hover or right-click event messages are being sent when the combobox is expanded.
You can see this is the case when using Spy++.
I think the easiest would be to change to a listbox if your scenario allows you to do that.
As Wim said in his post, there's not a direct way to do this because the messages you want aren't fired.
As a comprise, you could try setting DropdownStyle=Simple; on the Combo and
shrink the scroll region to show a single line:
http://img34.imageshack.us/img34/1695/49557147.jpg
If you assign the Combo a context menu, it will open when the scroll region is right-clicked. You'd probably have to figure out what item was right-clicked. But as other have said, this doesn't sound like a standard Windows way or an intuitive use.
Or how about a modal dialog that you could bring up from the Combo's context menu? On the dialog, you could have a list that the user could select from and a Delete button to delete the selected item(s).
Since MenuItem doesn't have a ContextMenu property it isn't as easy as it is with many other controls. You'll probably need to capture the right-click event and then position and show the context menu manually.
Two caveats though:
The combobox list will close when the
list loses focus, so it may close
when the context menu is shown
leaving the user unclear as to what
they clicked on (not 100% sure on
this, since I haven't written the
code to test.)
More importantly though I would argue
that this is a poor UI choice, I
can't think of any real world
applications I've used that have
context menus on menu items, so it
wouldn't be very discoverable for the
end user. Plus context menus should
be just for quick access, they
shouldn't be the only way to access
functionality. Are you going to be
able to expose these functions
through other means as well as the right-click menu?
You could do it manually, by capturing the event on the form, but consider making a nested menu instead. If your combobox items have menus of their own, combobox probably isn't the right choice.
For those asking "Why?" or saying they've never seen a combobox with a contextmenu; Look at any web browser's favorites dropdown. You can right click and delete, edit, or go to the entry in current tab, new tab, or new window.
I also could not get an actual contextmenustrip to show, so I made a menu with a small borderless form and call with:
Private Sub FavoritesBar_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles FavoritesBar.SelectedIndexChanged
FavIndex = FavoritesBar.SelectedIndex 'FavIndex is declared as a public string.
Dim Loc As Point = New Point(MousePosition)
FavMenu.Location = Loc
FavMenu.ShowDialog()
End Sub
With a homemade contextmenu, be sure to add "me.close" at the end of each sub as well as the me.mouseleave event.
I'm working on a custom user control that essentially displays a name value pair (name is on a black background, value on a white). I have my control displaying correctly, even showing up in Designer and on my build page.
What I'd like to do from here is have the ability to right click on the user control and have a menu come up that has a "Copy Value" option, that when selected will copy the value in the "value" part of the user control to the clipboard. What is the best method of approach?
I'm not sure where to start since most of the documentation on user controls I've found deals with displaying the control, not necessarily interacting with it. Additionally, since I'm still learning C#, I might have left out an important part of my problem in this question, so please point that out if it's the case.
I'm using Visual Studio 2008 (if that matters).
Examine the ContextMenu control and the ContextMenu property of other controls. By assigning a ContextMenu control to the ContextMeny property of another control, you will have the right-click->popup menu wiring done for you. Then you only need to implement the click event of the different menu items in the context menu.
Then you can use the Clipboard.SetText (as suggested by BFree) to set the desired value to the clipboard.
Add a ContextMenu to the control. The, hook into the MouseClick (or MouseDown, whichever works better) event and if it's a Right-Click, then call show on the ContextMenu (there are a few overloads, try to mess with them see which works best for you). Then, in the click event of your context menu, just call Clipboard.SetText(...) to set the value to the clipboard.
In a simple dialog app, using designer, I've set up the usual shortcut keys for cut, copy, paste and delete in the edit menu.
My problem is that I only want to handle delete events when a certain tree control is in focus. Otherwise, in my datagrid control for example, I want delete to work as usual.
What's the best way to do this? Currently I'm getting a delete event in the main form class, but the delete key isn't working in the edit controls in the datagrid control.
Edit - specified that the delete key isn't working in edit sub-controls
It seems that if you want to use the shortcut keys for menu items, that keycombination is taken throughout your form, no matter if you set up your eventhandler to not do anything unless a certain tree control is in focus (there is no way to set the key-event as .Handled=false).
So the best way would be to NOT set the shortcut-key in the menu-strip, but instead hook the KeyDown event on the form (keypreview) or on the specific tree control, and handle whatever the delete shortcut key should do there.
If you need the shortcut text to show even though you have no shortcut key defined in the menu-strip, use the .ShortcutKeyDisplayString property on the menu item to set a text.
If you're only going to have one form and only one datagrid,
the simplest method would be to fire off your datagrid delete events from the click event invoked by your menu item. Whichever row is current (bindingsource) or selected (datagrid), you can delete programmatically.