C# Composite Event - c#

I am creating a UserControl with a other controls inside. I want to create some form of "composite" event to provide for the forms using the UserControl.
For example: I have a lot of panels inside of this UserControl. I am creating one EventHandler inside the UserControl to handle all MouseDown events of these panels. In the end I want to make all MouseDown events on the UserControl to appear as just MouseDown on the parent.
I could create a new Event like MousePressed on this UserControl, but I would rather go with the already existing name MouseDown. How do I have to declare this new event in order to "hide" the other MouseDown Event that already exists?
I hope I could explain my question enough.
Thanks in advance.

Register all events needed in the UserControl (except the event of the UserControl itself, this will be the one needed to register on the parent form).
Most events seem to have a method used to call them. You can call this method starting with "On". For example: OnMousePressed
// You can register all MouseDown Events you need in one EventHandler.
private void Item_MouseDown(object sender, MouseEventArgs e)
{
// Call this method to call the UserControls event.
this.OnMouseDown(e);
// Register to the UserControl's MouseDown event where you want to catch it.
}

Related

Possible to ask for a keypressed signal at a centralized location in a paneled form?

I've got a winform application. In the application I have a Panel with multiple Buttons.
Now when the Buttons don't have the Focus I can capture the keypressed Events in the form itself. But when the Buttons have the Focus the form (even if the Buttons don't catch the Event explecitely) only they get the keypressed Event and not the form.
Now my question is: Is there any way to centralize the keypressed behaviour (without creating a keypressed Event for each and every button and call a central method with that Event)?
In essence only 1 method needs to be defined with the appropriate Parameters:
Example:
private void Event_Key_Press_Check(object sender, KeyPressEventArgs e)
This method then only Needs to be put in as the Name of the method used in the Event (form designer), or added as the Event.
That way only 1 method is used.
Thus there is no shorter way and the Event Needs to be defined for every single button (instead of 1 central Event that is always triggered).
Set form property KeyPreview to true and set KeyPress handler. Then form will handle this event before buttons.
See KeyPreview MSDN documentation.
I've had the same issue, and it was pretty easy to resolve :)
Check here : KeyPress at form level with controls
Just set the KeyPreview property (of your form) to True. This way your form will handle KeyPress event before any other control, even if one of them has the focus

Call a method in another class from a control within a control?

I have a custom control created, comprised of a bunch of text boxes, 1 button and radio buttons.
I then have a "parent" control which only has this 1 custom control placed on it, and in the code behind I have a reference to this control's Presenter.
The presenter handles the actual code for searching (when the one button is pressed). How do I set up the button click event on the child control to call the Search method from the presenter?
So I have the following:
CtlSearchDetails
ViewSearchScreen
PresenterSearchScreen
The button click event is on CtlSearchDetails and it needs to call the method on PresenterSearchScreen. I cannot figure out how to reveal this method to the instace of the control on ViewSearchScreen.
In your custom child control, you want to expose an event for the button click:
public event Action OnButtonClicked;
Then hook the button clicked event from the designer
private void btn_myButton_Clicked(object sender, EventArgs e)
{
if (OnButtonClicked != null)
OnButtonClicked();
}
Then in your parent container, you want to handle this event from the child control
this.myChildControl.OnButtonClicked += new Action(onChildButtonClicked);
private void onChildButtonClicked()
{
// Do your search here
}

Disabling child control events

The child controls of my custom control are obstruction the mouse events in my custom control. I have worked through the accepted answer and the answer at the bottom of this thread...
exposing-events-of-underlying-control
I haven't gotten them to work (the answer at the bottom seemed most straight forward to me). But really I would like to disable the events of them altogether. I have a pictureBox and a label, I don't need to interact with either of the child controls. Is there a way to disable them so they wont interfere with the events of my custom control?
Edit:
I'm using the custom control to gather and process a number of things and make them available as properties. When I click on it, I need to access to the properties. When the event happens at the child control, I don't have access to the propertied of my custom control. The following code is in my form...
public void Form1_MouseDown(object sender, MouseEventArgs e)
{
var myControl = sender as SubstanceViewer;
richTextBox1.Text = myControl.substanceInfo;
}
so I will need to access the properties of the parent control.
If you need the the events that are normally trapped by the child controls to be handled by the custom control itself, then simply wire up those events at run-time in the constructor of the custom control.
For example if you needed the MouseMove() event of the PictureBox and Label to fire the already wired up event of the UserControl:
public partial class SomeUserControl : UserControl
{
public SomeUserControl()
{
InitializeComponent();
this.pictureBox1.MouseMove += SomeUserControl_MouseMove;
this.label1.MouseMove += SomeUserControl_MouseMove;
}
private void SomeUserControl_MouseMove(object sender, MouseEventArgs e)
{
}
}
Be aware, though, that since different controls are firing the same handler you'll need to take that into account. For example, the e.X and e.Y values in the handler above would be relative to the source control.
*You can also wire these events up at design-time using the IDE itself, but I thought code better illustrated the solution.

ListView events set in the properties don't work

I am trying to use the MouseClick event from the properties of a listView to handle left and right mouse clicks.
Unfortunately the event never seems to fire. (Double clicked on the event to create a property, entered a bit of simple code and placed a breakpoint on the first line). The same is true of several other events listed in the properties (ItemSelectionChanged seems to work but the other events I have tried don't fire.
Here is the code added:
In form.designer.cs:
this.listView1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseClick);
In form.cs:
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
Some code
}
That method never gets called when I click on the listview. The listview is inside a tab on top of the stack.
I guess I am probably forgetting something very basic but what?
ListView is a bit unusual, its MouseClick event doesn't fire unless you click an item in the view. Workaround is to use the MouseDown or MouseUp event instead. You typically are much more interested in the ItemSelectionChanged event btw. You probably need its HitTest() method to see exactly what was clicked if you use MouseDown/Up.

Simulating events on UIElement's without inheriting on Windows Phone 7

I have a very simple requirement, i.e. I want to send a synthetic event to a UIElement, in this case, a Grid. What I want is simply that I be able to send a synthetic event to an UIElement.
For example,
StackPanel myPanel;
StackPanel topPanel;
topPanel.MouseLeftButtonUp += new MouseButtonEventHandler(topPanel_MouseLeftButtonUp);
private void topPanel_MouseLeftButtonUp(object sender, MouseEventArgs args) {
// Here I want to send the MouseLeftButtonUp event to myPanel
}
It is possible using RaiseEvent, but it is a protected event and hence I cannot just call it on an instance of any UIElement. So how do I go about sending a synthetic event on existing classes?
P.S: The reason that I cannot create custom inherited classes is that the current code base is too huge and the number of changes that will be required in case I take such an approach are not feasible.
Any help is greatly appreciated.
Regards,
roahn
Instead of raising events, you could just move the relevant code from the event handler to a method. Then, you can just call the method whenever you want to simulate a button click. However, if you want to simulate the button click on an element, you could do this:
//Assuming myPanel_MouseLeftButtonUp is the event handler for myPanel
myPanel_MouseLeftButtonUp(null, null);

Categories

Resources