none
Steuerelemente mit Entwurfszeitverhalten in eigener Applikation RRS feed

  • Frage

  • Hallo,

    ich arbeite zur Zeit an einem Editor, mit welchem man Formulare zur Dateneingabe erstellen können soll. Dazu möchte ich, ähnlich einem GUI-Designer, Steuerelemente in meiner Applikation vom Anwender positionieren lassen.

    Ist es möglich diesen Steuerelementen das aus dem GUI-Designer im Visual Studio bekannte Enwrfszeitverhalten zu geben? Also dass zum Beispiel ein Button keinen Effekt zeigt wenn man mit der Maus darüber fährt oder nicht "reingedrückt" wird, wenn man darauf klickt.

    Meine Idee dazu wäre einen Adorner zu implementieren, der transparent ist und sich komplett über die Steuerelemente drüber liegt, sodass diese nicht mehr auf die Mausevents reagieren. Ich bin mir nur nicht sicher ob das so eine schöne Lösung ist und ob es nicht vielleicht auch anders funktioniert. Man kann ja beispielsweise auch die angefügte Eigenschaft DesignerProperties.IsInDesignMode bei den entsprechenden Steuerelementen auf True setzen. Ich dachte, dass sich mein Problem damit lösen lässt, allerdings zeigt sich nach dem Setzen dieser Eigenschaft kein verändertes Verhalten.

    Vielen Dank im Voraus für die Unterstützung.

    Gruß Florian

    Samstag, 17. Juli 2010 07:43

Antworten

  • Hallo Florian,

    • Du schriebst: "ich arbeite zur Zeit an einem Editor ..."

    ich erinnere mich, das war hier. Ich hatte übrigens dort ganz unten noch einen Link auf einen rudimentären:
    [Layout Designer / http://layout.codeplex.com/]  zugefügt. Und Dinge wie das "ResizingAdorner" Sample sind Dir bekannt.

    • Du sagtest: "Also dass zum Beispiel ein Button keinen Effekt zeigt wenn man mit der Maus darüber fährt oder nicht 'reingedrückt' wird, wenn man darauf klickt."

    Wenn es reicht, setze ggf. einfach IsHitTestVisible des UIElementes auf false.
    Wenn diese auf false festgelegt ist, meldet ein UIElement keine Eingabeereignisse, z. B. MouseLeftButtonDown, und kann nicht den Fokus erhalten. Ein weitergeleitetes Eingabeereignis, das von einem anderen Objekt ausgelöst wurde, kann aber weiterhin an oder über ein Objekt in der Objektstruktur weitergeleitet werden, für das  IsHitTestVisible  false ist.

    Ansonsten gäbe es natürlich viele weitere Möglichkeiten bis hin zum expliziten Handling in einem eigenen HwndSource-Hook oder einer Umsetzung über die [Erweiterbare Architektur des WPF-Designers], was aber wohl in Deinem Fall nicht möglich war.


    ciao Frank
    • Als Antwort markiert FloKl Donnerstag, 22. Juli 2010 07:10
    Sonntag, 18. Juli 2010 08:11

Alle Antworten

  • Wie wäre es, wenn die entsprechenden PreView-Ereignisse im Container abgefangen und nicht weitergeleitet werden?

    --
    Viele Gruesse
     
    Peter
    Samstag, 17. Juli 2010 08:09
  • Hallo Florian,

    • Du schriebst: "ich arbeite zur Zeit an einem Editor ..."

    ich erinnere mich, das war hier. Ich hatte übrigens dort ganz unten noch einen Link auf einen rudimentären:
    [Layout Designer / http://layout.codeplex.com/]  zugefügt. Und Dinge wie das "ResizingAdorner" Sample sind Dir bekannt.

    • Du sagtest: "Also dass zum Beispiel ein Button keinen Effekt zeigt wenn man mit der Maus darüber fährt oder nicht 'reingedrückt' wird, wenn man darauf klickt."

    Wenn es reicht, setze ggf. einfach IsHitTestVisible des UIElementes auf false.
    Wenn diese auf false festgelegt ist, meldet ein UIElement keine Eingabeereignisse, z. B. MouseLeftButtonDown, und kann nicht den Fokus erhalten. Ein weitergeleitetes Eingabeereignis, das von einem anderen Objekt ausgelöst wurde, kann aber weiterhin an oder über ein Objekt in der Objektstruktur weitergeleitet werden, für das  IsHitTestVisible  false ist.

    Ansonsten gäbe es natürlich viele weitere Möglichkeiten bis hin zum expliziten Handling in einem eigenen HwndSource-Hook oder einer Umsetzung über die [Erweiterbare Architektur des WPF-Designers], was aber wohl in Deinem Fall nicht möglich war.


    ciao Frank
    • Als Antwort markiert FloKl Donnerstag, 22. Juli 2010 07:10
    Sonntag, 18. Juli 2010 08:11
  • Hallo,

    vielen Dank für die Antworten. Von der Idee die Preview-Ereignisse abzufangen und einfach nicht weiterzuleiten war ich zunächst ziemlich begeistert. Für das Klick-Ereignis funktioniert dies auch wie gewünscht (ein Button wird nicht mehr "reingedrückt") allerdings gibt es soweit ich sehe kein PreviewMouseEnter-Ereignis (zumindest nicht bei einem Grid, welches ich als Conainer für die Elemente verwende), sodass ich den Effekt nicht wegbekomme, der entsteht, wenn man mit der Maus über einen Button fährt.

    Die Eigenschaft IsHitTestVisible löst mein Problem eigentlich, allerdings kann ich dann natürlich nichtmehr bestimmen auf welches Steuerelement der Anwender geklickt hat beispielsweise um es zu markieren.

    Ich werde schauen ob ich eine der Lösungen für meine Zwecke anpassen kann.

    Gruß Florian

    Montag, 19. Juli 2010 07:32