Mam formularz C# (nazwijmy go MainForm) o liczbie kontroli celnych na nim. Chciałbym, aby metoda MainForm.OnClick() była uruchamiana za każdym razem, gdy ktoś kliknie w formularz, niezależnie od tego, czy kliknięcie nastąpiło w formularzu, czy też kliknięcie dotyczyło jednego z elementów sterujących. Szukam zachowania podobnego do funkcji KeyPreview w formularzach z wyjątkiem kliknięć myszy, a nie naciśnięć klawiszy.Jak ustawić zdarzenie kliknięcia dla formularza?
Odpowiedz
W zdarzeniu ControlAdded formularza dodaj handler MouseClick do formantu, za pomocą opcji Adres zdarzenia kliknięcia formularza. Nie testowałem tego, ale to może zadziałać.
Private Sub Example_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded
AddHandler e.Control.MouseClick, AddressOf Example_MouseClick
End Sub
Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
MessageBox.Show("Click")
End Sub
Catching kliknij na otwartej przestrzeni na formularzu jest łatwe, ale żeby kliknięcie, która jest faktycznie na kontrolę, trzeba współpracy tej kontroli, aby wysłać go do formy.
Jedną z możliwości jest umieszczenie przejrzystą kontrolę nad całym formie i zaakceptować kliknięć na tym, radzenia sobie z nimi, a następnie przekazać je na właściwej kontroli pod spodem.
Mam wrażenie, że musi być bardziej eleganckie rozwiązanie niż to. – Mykroft
Jest to wspólny wzór w rozwoju, jego nazwie wzorzec Obserwator. Istnieje wiele przykładów wzorców Observer i C# tutaj jest 1 przykład http://msdn.microsoft.com/en-us/library/ms954621.aspx, ale mają dobre google dookoła.
Jedynym sposobem, jaki kiedykolwiek udało się to zrobić, aby obsłużyć [c] Kliknij [/ c] wydarzeniem każdej kontroli. Nie wierzę, że wydarzenie zostanie podniesione, zanim kontrola go przetworzy.
W WPF, istnieje „tunelowania” Podgląd zdarzeń, które zapewniają tę funkcjonalność, ale to nie naprawdę pomóc w WinForms.
Cóż, jest za późno, aby przejść do WPF teraz, ale będę musiał poważnie rozważyć użycie go w przyszłości, jak sądzę. – Mykroft
można podłączyć wszystkie zdarzenia formantu, jeśli chcesz, a następnie monitorować w ten sposób. Zakładam, że jest jakaś popularna metoda Win32 api, aby uwięzić je wszystkie, ale w tej chwili jest to poza mną.
public Form1()
{
InitializeComponent();
HookEvents();
}
private void HookEvents() {
foreach (Control ctl in this.Controls) {
ctl.MouseClick += new MouseEventHandler(Form1_MouseClick);
}
}
void Form1_MouseClick(object sender, MouseEventArgs e)
{
LogEvent(sender, "MouseClick");
}
// and then this just logs to a multiline textbox you have somwhere on the form
private void LogEvent(object sender, string msg) {
this.textBox1.Text = string.Format("{0} {1} ({2}) \n {3}",
DateTime.Now.TimeOfDay.ToString(),
msg,
sender.GetType().Name,
textBox1.Text
);
}
Wyjście jest coś takiego, pokazując wszystkie zdarzenia i kto "Wysłane" je:
14:51:42.3381985 MouseClick (Form1)
14:51:40.6194485 MouseClick (RichTextBox)
14:51:40.0100735 MouseClick (TextBox)
14:51:39.6194485 MouseClick (Form1)
14:51:39.2131985 MouseClick (RichTextBox)
14:51:38.8694485 MouseClick (Button)
HTH.
Zalecam utworzenie formularza podstawowego dla innych formularzy w aplikacji do dziedziczenia. Dodaj ten kod do swojej formie podstawowej, aby stworzyć nowe wydarzenie o nazwie GlobalMouseClickEventHandler:
namespace Temp
{
public delegate void GlobalMouseClickEventHander(object sender, MouseEventArgs e);
public partial class TestForm : Form
{
[Category("Action")]
[Description("Fires when any control on the form is clicked.")]
public event GlobalMouseClickEventHander GlobalMouseClick;
public TestForm()
{
InitializeComponent();
BindControlMouseClicks(this);
}
private void BindControlMouseClicks(Control con)
{
con.MouseClick += delegate(object sender, MouseEventArgs e)
{
TriggerMouseClicked(sender, e);
};
// bind to controls already added
foreach (Control i in con.Controls)
{
BindControlMouseClicks(i);
}
// bind to controls added in the future
con.ControlAdded += delegate(object sender, ControlEventArgs e)
{
BindControlMouseClicks(e.Control);
};
}
private void TriggerMouseClicked(object sender, MouseEventArgs e)
{
if (GlobalMouseClick != null)
{
GlobalMouseClick(sender, e);
}
}
}
}
Takie rozwiązanie będzie działać nie tylko dla kontroli najwyższego poziomu, ale również zagnieżdżone elementy sterujące takie jak kontrolnych umieszczonych wewnątrz paneli.
Dzięki za tonę! Proste i eleganckie rozwiązanie. Zastanawiam się, dlaczego nie ma czegoś podobnego do 'KeyPreview' dla kliknięć myszą –
- 1. Zdarzenie kliknięcia przejścia CSS3
- 2. Zdarzenie kliknięcia przycisku jest wyzwalane przy przesyłaniu formularza z wpisem
- 3. Jak wyłączyć zdarzenie kliknięcia znacznika?
- 4. Zdarzenie wielokrotnego kliknięcia JQuery?
- 5. Zdarzenie kliknięcia przycisku dla widgetu Android
- 6. jak przerwać zdarzenie dwukrotnego kliknięcia w datagridview?
- 7. Zdarzenie wyzwalające dla kliknięcia nadrzędnego, ale nie dla dzieci
- 8. Jak debugować określone zdarzenie kliknięcia javascript?
- 9. Jak uzyskać zdarzenie kliknięcia znacznika tekstu
- 10. Jak ręcznie uruchomić zdarzenie kliknięcia w ReactJS?
- 11. Jak powiązać zdarzenie dla wszystkich danych wejściowych formularza?
- 12. Unikaj, że EditText zużywa zdarzenie kliknięcia.
- 13. Określ zdarzenie dwukrotnego kliknięcia dla formantu w Visual Studio Designer
- 14. Zdarzenie kliknięcia wyzwalacza z dyrektywy angularjs
- 15. Zdarzenie najechania i kliknięcia na urządzeniach mobilnych
- 16. Jak ustawić stan kliknięcia dla mojego przycisku niestandardowego?
- 17. Zdarzenie kliknięcia FrameLayout nie uruchamia się
- 18. Zdarzenie kliknięcia dla elementów dodanych do DOM dynamicznie
- 19. WPF: Jak przypisać zdarzenie click do formularza
- 20. Jak wykryć zdarzenie kliknięcia na mapie google za pomocą nakładki?
- 21. Zdarzenie kliknięcia wiązania jquery do wielu przycisków
- 22. Poczekaj, aż zostanie uruchomione zdarzenie kliknięcia C#
- 23. Zdarzenie kliknięcia obrazu w płótnie HTML5
- 24. Zdarzenie kliknięcia mobilnego jQuery nie działa
- 25. iPad ma trzy kliknięcia dla zdarzenia kliknięcia JavaScriptu
- 26. ExtJS Jak dodać zdarzenie kliknięcia do wykresów kołowych
- 27. Jak wywołać zdarzenie "kliknięcia" na wejściu do pliku w Angular?
- 28. Jak usunąć zdarzenie kliknięcia z elementu w JavaScript?
- 29. jak wywołać zdarzenie kliknięcia pliku wejściowego z kliknięcia przycisku w kancie 2?
- 30. W symfony, jak ustawić wartość pola formularza?
To wciąż wydaje się być trochę hackerem, ale wydaje mi się, że to najlepsza opcja, jaką mam. – Mykroft