Laden...

Wie kann ich beim Klick (Maus oder Tastatur) auf einen TextBlock ein Ereignis auslösen?

Erstellt von habib vor 3 Jahren Letzter Beitrag vor 3 Jahren 952 Views
H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren
Wie kann ich beim Klick (Maus oder Tastatur) auf einen TextBlock ein Ereignis auslösen?

Habe einen TextBlock und möchte beim Klick darauf (egal ob mit Maus oder Tastatur) ein Ereignis ausgelöst haben. Wäre auch schön, wenn der Mauszeiger sich als Hand verwandeln könnte wenn man darüber fährt.

Die Frage: Wie gehe ich im besten Fall vor.

Jeweils ein MouseDown und KeyDown Event erstellen wo die Methode aufgerufen wird?
G
Oder ist eine TextBox dafür besser geeignet?

16.833 Beiträge seit 2008
vor 3 Jahren

In WPF arbeitet man nicht direkt mit Events; das ist in WPF so nicht wirklich vorgesehen.
[Artikel] MVVM und DataBinding

Im Falle von Events wie MouseDown würdest Du zB. einen Event-Trigger definieren, der auf MouseDown hört und dann einen Command auslösen (InvokeCommand)
Siehe auch Handling events in an MVVM WPF application

5.658 Beiträge seit 2006
vor 3 Jahren

Außerdem gibt es in WPF für diesen Zweck bereits den HyperLink.

Zum Erstellen von speziellen Mouse-Over-Effekten o.ä. würde man mit Styles arbeiten. Siehe dazu [Artikel] MVVM und DataBinding, Abschnitt 4. Styles und Trigger

Weeks of programming can save you hours of planning

H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren

Außerdem gibt es in WPF für diesen Zweck bereits den
>
.

Habe das mal folgendermaßen eingebunden:


<TextBlock>
    <Hyperlink NavigateUri="ApplicationCommand.Copy" >
        <TextBlock Name="tb_NameBox" />
    </Hyperlink>
</TextBlock>

Der Text in der Box wird zwar wie ein Link angezeigt, allerdings wird nichts kopiert.

4.939 Beiträge seit 2008
vor 3 Jahren

ApplicationCommands.Copy (wie auch die anderen) sind ja auch Commands und keine Uri, deshalb mußt du es an Hyperlink.Command binden.

H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren

Und genau da liegt mein Problem, das ich nicht weis wie und was. Gibt es dafür auch einen FAQ Artikel?

Gibt es noch eine Möglichkeit das ganze so zu machen, dass alle TextBlock diese Methode haben?

4.939 Beiträge seit 2008
vor 3 Jahren

Steht doch auch im MVVM-Artikel unter "Commands".
Bzw. direkt (ohne ViewModel):


<Hyperlink Command="ApplicationCommands.Copy">

PS: Um alle Textblöcke damit zu versehen, verwende Styles (s.a. Wie kann ich nur die Elemente stylen, die sich in einem StackPanel befinden?).

H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren

Und wenn ich dies genau so machen, bekomme ich folgende Meldung zurückgeworfen:

XDG0008	"ApplicationCommand" wird in einem Windows Presentation Foundation (WPF)-Projekt nicht unterstützt.
4.939 Beiträge seit 2008
vor 3 Jahren

Edit: Ich sehe gerade, es muß ja auch

"ApplicationCommands.Copy"

(Plural) lauten!

H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren

Danke das war der Fehler gewesen.
Allerdings bin ich zu doof, wie kann ich jetzt auswählen was kopiert werden soll wenn man darauf klickt?

5.658 Beiträge seit 2006
vor 3 Jahren

@habib

Bitte beachte [Hinweis] Wie poste ich richtig?

1.1 Erst suchen und in die Doku schauen, dann posten
1.2 Nur ein Thema pro Thread

Ein Blick in die Doku hätte das Problem mit dem fehlenden "s" innerhalb von einer Minute gezeigt. Und bitte erstelle jeweils einen Thread pro Frage. Hier geht es um das Auslösen den Click-Ereignissen bzw. Commands, nicht um das Arbeiten mit der Zwischenablage.

Weeks of programming can save you hours of planning

C
34 Beiträge seit 2018
vor 3 Jahren

Habe dazu mal eine kleine Frage, hoffe das ist erlaubt.

Bei Buttons verwendet man allerdings weiter ein Click Event, oder?

16.833 Beiträge seit 2008
vor 3 Jahren

Nein, bei WPF arbeitet man mit MVVM und damit respektive mit Commands.
[Artikel] MVVM und DataBinding

H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren

Nein, bei WPF arbeitet man mit MVVM und damit respektive mit Commands.

>

Habe jetzt einiges an Tutorials gelesen und Videos gesehen. Aber immer werden Eventhandler genutzt. Irgendwie bin ich nun verunsichert. Selbst im WPF Buch habe ich dies gelesen.

16.833 Beiträge seit 2008
vor 3 Jahren

Es gibt hunderte Bücher; nicht nur das eine. Welches meinst Du?

Man braucht bei WPF nur in ganz gewissen Fällen Events.
Ansonsten macht man alles über Commands.

H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren

Windows Presentation Foundation: Das umfassende Handbuch zur WPF, aktuell zu .NET Core 3.0
von Thomas Claudius Huber.

Hab mal einen Screen angefügt.

16.833 Beiträge seit 2008
vor 3 Jahren

Es ist in Büchern und in Tutorials üblich, dass man Code, der nicht mit dem konkreten Beispiel zutun hat, vereinfacht.
Hier geht es offenbar um das StackPanel und nicht zu Commands. Hast Du Dir das Kapitel zu den Commands überhaupt schon durchgelesen?

WPF ist auf den MVVM Pattern ausgelegt und im MVVM Pattern gibt es keine Events.
Ich kenne Thomas' aktuelle Fassung des Buchs nicht, aber ich bin mir sehr sicher, dass das auch in dem Buch steht.

Aber wenn es Dich verwirrt, dann gib ihm Feedback.
Thomas' is nen sehr netter und auch aktiv in der .NET Community; man erreicht ihn zB auf Twitter ganz gut.

H
habib Themenstarter:in
24 Beiträge seit 2020
vor 3 Jahren

Bin gerade dabei Commands durchzuarbeiten.

Danke für den Tipp mit dem Feedback geben.

Man braucht bei WPF nur in ganz gewissen Fällen Events.

Welche wären das?

Wenn ich nur ein Click Event habe, wäre es da nicht günstiger das ganze über Eventhandler zu machen? Ist am Ende ja nur ein kleines Tool.

16.833 Beiträge seit 2008
vor 3 Jahren

Eine Technologie interessiert es nicht, ob Deine Anwendung groß oder klein ist - das ist alles relativ.
WPF ist einfach auf MVVM und damit Commands ausgelegt.

Nur Du selbst kannst entscheiden, wie pragmatisch Du Deinen Code umsetzt.