myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: WPF und Silverlight » TextBlock Visibility in Abhängigkeit von TabItem-Focus; welcher Trigger?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

TextBlock Visibility in Abhängigkeit von TabItem-Focus; welcher Trigger?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
GeneVorph GeneVorph ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.02.2015
Beiträge: 90
Entwicklungsumgebung: Visual Studio 2013


GeneVorph ist offline

TextBlock Visibility in Abhängigkeit von TabItem-Focus; welcher Trigger?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

Folgende Funktionalität möchte ich herstellen:

In einem TabControl habe ich im Header jedes TabItems zwei TextBlocks. Im ersten TextBlock befindet sich die Bezeichnung des TabItems, im zweiten TextBlock ein Symbol-Font.
Ich möchte, dass jeweils der Text im ersten TextBlock des ausgewählten TabItems lesbar ist, sobald das TabItem Focus besitzt, d.h. die Visibility des ersten TextBlocks von Collapsed auf Visible geändert wird.

In Code behind ist es zwar ganz einfach, ich möchte es aber - wenn möglich - im xaml-code lösen.

hier mein Code:

XML-Code:
<TabItem x:Name="Item2" GotFocus="Item2_GotFocus" LostFocus="Item2_LostFocus">
                    <TabItem.Header>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock x:Name="Text2" FontSize="14" FontFamily="Quicksand" VerticalAlignment="Center">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock">
                                        <Setter Property="Visibility" Value="Collapsed"/>
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding ElementName=Item2, Path=IsFocused}" Value="True">
                                                <Setter Property="Visibility" Value="Visible"/>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            Große<LineBreak/>Leistungsnachweise
                            </TextBlock>
                            <TextBlock Margin="20,0,0,0" FontSize="32" FontFamily="APPFONT" VerticalAlignment="Center">B</TextBlock>
                        </StackPanel>
                    </TabItem.Header>
                </TabItem>

Leider funktioniert obiger Code nur einmal - danach wird die Bezeichnung nicht mehr angezeigt, d.h. die Visibility des TextBlocks Text2 bleibt ständig auf "Collapsed".

Die Funktionalität sollte aber ständig gegeben sein: erhält das jeweilige TabItem Fokus, dann soll der jeweilige TextBloxk1 im Header sichtbar sein, verliert das TabItem den Fokus, soll der jewilige TextBlock collapsed sein.

Wahrscheinlich benutze ich gar nicht den richtigen Trigger? Brauche ich einen EventTrigger, der auf den Item2_GotFocus-Event reagiert? Leider scheinen EventTrigger nur mit StoryBoards zu funktionieren, aber ich will ja gar nichts animieren?

Zur Verdeutlichung ein Bild im Anhang (der von mir verwendete Font ist selbsterstellt, funktioniert also nicht bei jedem...).

Gruß Vorph

GeneVorph hat dieses Bild (verkleinerte Version) angehängt:
B3.png
Volle Bildgröße

Neuer Beitrag 20.06.2019 08:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
KroaX KroaX ist männlich
myCSharp.de-Mitglied

avatar-4080.jpg


Dabei seit: 31.08.2009
Beiträge: 275
Entwicklungsumgebung: VS2012
Herkunft: Köln


KroaX ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das Problem warum es nicht funktioniert:

Im Scope deines Styles gibt es kein Element Item2 auf das du zugreifen könntest. Aus deinem Style heraus auf Elemente zugreifen kannst du höchsten indem du den Visual Tree nach oben läufst. Das könntest du machen indem du mit FindAncestor nach dem erstmöglichen TabItem suchst und dich daran bindest.

 https://stackoverflow.com/questions/1843...source-in-style
Neuer Beitrag 20.06.2019 09:05 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
GeneVorph GeneVorph ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.02.2015
Beiträge: 90
Entwicklungsumgebung: Visual Studio 2013

Themenstarter Thema begonnen von GeneVorph

GeneVorph ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo KroaX und vielen Dank für deine Antwort.

Leider ist der Link etwas "beyond my scope" Augenzwinkern
Aber ich denke, ich weiß in etwa wie es gemeint ist. Daher drei zusätzliche Fragen:

1. gerade weil

Zitat:
[...]Style heraus auf Elemente zugreifen kannst du höchsten indem du den Visual Tree nach oben läufst.

verstehe ich jetzt immer noch nicht, warum es beim ersten mal klappt?

2. So wie ich das verstehe, müsste ich z. B. in der Window-Resource ein Style-Template für den Typ TextBlock anlegen Ist das richtig?
Im Beispiel kann man es nicht sehen, aber ich möchte ja nur bestimmte TextBlocks ansprechen - das heißt ich arbeite hier mit x:Key?

3.

Zitat:
Das könntest du machen indem du mit FindAncestor nach dem erstmöglichen TabItem suchst und dich daran bindest.

Muss ich das dann auch im Template unterbringen? Die Frage ist dann wo? Und wie kann ich an FindAncestor binden, denn der würde dann ja erst gesucht.
Es gibt keine Möglichkeit hier mit den x:Name-Attributen zu arbeiten? Denn die sind ja für die Tabs bekannt...

Vielen Dank,
schöne Grüße
Vorph
Neuer Beitrag 20.06.2019 11:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.186
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wenn du es so machen willst, wie du gezeigt hast, dann solltest du, wie von KroaX vorgeschlagen, FindAncestor verwenden. Wenn du das nicht kennst, mußt du wenigstens mal in die Doku dazu schauen. Deine Fragen ergeben jedenfalls in dem Zusammenhang wenig Sinn.

Ansonsten kann man soetwas auch immer über eine entsprechende Eigenschaft im ViewModel lösen. Die Eigenschaft enthält das aktuell ausgewählte Tab, und sowohl das TabItem als auch die Visibility-Eigenschaften werden einfach daran gebunden.

Davon abgesehen heißt die Eigenschaft für das aktuell ausgewählte Tab  IsSelected und nicht IsFocused.

Einen Trigger brauchst du dafür auch nicht unbedingt, du kannst einfach direkt binden und einen  BooleanToVisibilityConverter verwenden.

Siehe dazu auch:  [Artikel] MVVM und DataBinding
Neuer Beitrag 20.06.2019 16:08 Beiträge des Benutzers | zu Buddylist hinzufügen
GeneVorph GeneVorph ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.02.2015
Beiträge: 90
Entwicklungsumgebung: Visual Studio 2013

Themenstarter Thema begonnen von GeneVorph

GeneVorph ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

So, ich muss zwei Dinge kurz klarstellen:

1. ich code rein hobbymäßig, wenn Beruf und Familie es gestatten (d.h. alle paar Wochen mal ein paar Stunden). Einiges habe ich schon verstanden, vieles noch nicht.

2. Anfängerfehler passieren daher immer wieder. Und manche Fehler sind halt "dumm". So wie dieser.

Problem gelöst!

Mein xaml-code funktioniert - lediglich die Event Handler gaaanz obe im xaml-code blieben unbemerkt. GetFocus und LostFocus. Dort stand tatsächlich noch Code drin, der die Visibility der TextBlocks auf Collapsed setzt. Kein Wunder, dass es nicht funktioniert hat.

Es geht also einfach (ganz einfach sogar) mit den Triggern. Man bekommt meinen Code zum Laufen, wenn man die beiden Event Handler löscht. Ohne FindAncestor, ohne BooleanToVisibilityConverter. Das sind andere Wege, die mit Sicherheit zur selben Lösung führen.

Und nachdem ich mir nun Asche auf's Haupt gestreut habe: den xaml-Code mit den Triggern hatte ich in einer Kaffee-Pause auf ne Serviette gekritzelt - da bin ich doch ein bissl stolz, dass ich zumindest das scheinbar verstanden habe ;-)

Trotzdem Danke für eure Hilfe - das Forum ist und bleibt Wissensfundus Nr. 1.
Gruß
Vorph
Neuer Beitrag 20.06.2019 23:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.09.2019 13:41