Re: Message Routing in Winform-Applikationen
- From: "Frank Dzaebel" <Post@xxxxxxxxxxxxxx>
- Date: Tue, 31 Jul 2007 22:40:26 +0200
Hallo Paul,
Ja natürlich .... hatte ich glatt übersehen (müsste ich natürlich wissen).vielen Dank für die Antwort. IMessageFiler + PreFilterMessage war mir
schon bekannt - wo ist denn der Unterschied zum direkten Überladen von WndProc?
In beiden Fällen habe ich Zugriff auf das gesamte Dispatching.
Nein. Wenn Du z.B. die WndProc einer Form überschreibst, werden die
Nachrichten der Container und Controls in den Containern normal nicht über
diese WndProc verarbeitet. Bei der IMessage-Schnittstelle funktioniert das!
Schön, dann können wir mal zum Event Routing übergehen.
Jo, dann sag mal was dazu. Wie Elmar ja bereits empfohlen hatte, könnte man
die WPF-Mechanik in WinForms nachbilden - da hätte man eine sehr schöne,
allgemeine Lösung. Nur lohnt sich das IMHO nicht... später steigen wir ja
doch um, und dann ist der Aufwand umsonst.
Tja, das sehe ich ähnlich. Man möchte und sollte das Rad nicht doppelt erfinden. Zwar lässt sich WPF innerhalb von WinForms und WinForms innerhalb von WPF ausführen, aber man muss da ganz vorsichtig mit den Erwartungen sein und gründlich in den Details vorchecken, bevor man Hybrid-Lösungen angeht. Das würde ich nicht machen, wenn es um einheitliches globales Event-Routing geht.
Ich denke, eine Nachbildung wäre zwar das sauberste, aber pragmatisch solltest Du eine Zwischenlösung benutzen. Dazu gleich.
Das Problem lässt sich allgemein so fassen: Der Zustand (enabled/disabled)
eines Commands hängt natürlich in erster Linie davon ab, wer den Focus hat
- schließlich beziehen sich Kommandos idR auf das fokusierte GUI-Element.
Aha, also wenn z.B. der Focus wechselt, dann soll ein Control auch einen anderen Zustand bekommen.
Ich würde aus Einfachheit zu einem globalen Handler tendieren. Also eigentlich dem IMessageFilter.
Ich muss aber sagen, dass ich evtl. von Deinem App-Kontext noch zu wenig weiss, um eine seriöse gute Antwort geben zu können. Nichts desto trotz, i'll try.
Leider gibt es ein paar Nebenwirkungen: auch andere Stellen der Software
(z.B. Background-Worker der übergeordneten Form) können Einfluss haben. Wir
brauchen also einen Mechanismus, der neben dem fokussiereten Element auch
die "offensichtlichen" weiteren Kandidaten berücksichtigt, was im
allgemeinen Falle nur ein Traversieren des Baumes bedeuten kann.
Naja, Du brauchst evtl. keinen Baum, wenn Du den Control-Container-Baum meinst. Ich sehe momentan keine Probleme beim BackgroundWorker. Bei Modifikationen aus anderen Threads nutzt Du ja sicher Control.Invoke und hast so keine Einschränkungen.
Zweite Aufgabe: Die Logik der Kommandos (Statusbestimmung, Ausführung) soll
an beliebiger Stelle stehen können. Zunächst (und im Normalfall) bei den
Controls selber, aber eben auch bei den anderen, "offensichtlichen"
Kandidaten (i.e. Form). In der WPF ganz hervorragend gelöst. Wie mach ichs
aber am Besten unter WinForms?
Seh ich eigentlich auch keine Probleme. Ggf. mit einem eigenen ExtenderProvider.
Wenn es alles Deine eigenen Control-Klassen sind, eher über normale Eigenschaften.
ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET
.
- References:
- Message Routing in Winform-Applikationen
- From: Paul Werkowitz
- Re: Message Routing in Winform-Applikationen
- From: Frank Dzaebel
- Re: Message Routing in Winform-Applikationen
- From: Paul Werkowitz
- Re: Message Routing in Winform-Applikationen
- From: Paul Werkowitz
- Message Routing in Winform-Applikationen
- Prev by Date: Re: Benennung von Steuerelementen
- Next by Date: Re: Benennung von Steuerelementen
- Previous by thread: Re: Message Routing in Winform-Applikationen
- Next by thread: DataGridViewComboBoxColumn und zugehörige Events
- Index(es):
Relevant Pages
|