Laden...

SL: Tooltip programmatisch mit Style hinzufügen

Erstellt von Easyrider vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.059 Views
E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 12 Jahren
SL: Tooltip programmatisch mit Style hinzufügen

Hallo,

ich bin gerade auf der Suche nach Lösungsansätzen für folgendes Problem:

Für ein neues Usercontrol (ListBox) soll der ToolTip variabel gestaltet werden. Das bedeutet, das pro ListBoxItem der ToolTip zur Laufzeit via Datenbankeinträge manuell gesetzt wird. Dieser soll in einer Liste von "ToolTipGroups" sowie ToolTipItems gespeichert werden.

ListBoxItem 1

  • ToolTipGroup 1
    -- ToolTipItem 1
    -- ToolTipItem 2
    -- ToolTipItem 3
  • ToolTipGroup 2
    -- ToolTipItem 1
    -- ToolTipItem 2
    -- ToolTipItem 3
    ...

Die ObservableCollection<ToolTipGroup> hat eine Liste von ToolTipItems. Ein ToolTipItem besitzt zwei Eigenschaften namens Key und Value, welche in zwei Textblöcken dargestellt werden soll.

Mein Problem besteht jetzt darin, das ich nicht weiß wie ich das ganze darstellen soll. Ich kann es nicht fest in XAML implementieren, da die Anzahl der ToolTipGroups und -Items unbekannt ist. Dynamisch kann ich (meines Wissens nach) nur Text als CodeBehind zum ToolTip hinzufügen.

Wie kann ich im Code-Behind den Content des ToolTips pro Item so setzen, dass er so arbeitet wie folgender Codeabschnitt?


<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding Key}" />
    <TextBlock Text="{Binding Value}" />
</StackPanel>

mfg

Easy

109 Beiträge seit 2011
vor 12 Jahren

Hallo,

du kannst das StackPanel in ein DataTemplate packen. Damit tust du sozusagen festlegen wie Daten visualisiert werden sollen.

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....

E
Easyrider Themenstarter:in
200 Beiträge seit 2006
vor 12 Jahren

Erstmal danke für deine Antwort.

Hast du vielleicht ein Beispiel dazu? Ich bekomme die Fehlermeldung "A value of type 'DataTemplate' cannot be added to a collection or dictionary of type 'ToolTipGroup'".

Zum Test habe ich mir ein Objekt in den Resources des Controls vom Typ ToolTipGroup angelegt. Darunter dann das DataTemplate. Ich bin mir ziemlich sicher, das ich es einfach noch falsch mache, verstehe aber den Fehler leider nicht ganz.


<class:ToolTipGroup x:Name="toolTipGroup">
    <DataTemplate>
        <Stackpanel>
         ...
        </Stackpanel>
    </DataTemplate>
</class:ToolTipGroup>

109 Beiträge seit 2011
vor 12 Jahren

Hallo,

nicht ganz 😃

Das DataTemplate wird meistens als Resource festgelegt. Hier mal für die Group-Collection:


    <UserControl.Resources>
        <DataTemplate DataType="{x:Type ToolTipGroup}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Key}" />
                <TextBlock Text="{Binding Value}" />
            </StackPanel>
            <!-- Hier kann stattdessen auch ein UserControl angegeben werden:
            <Views:ToolTipGroupView/>-->
        </DataTemplate>
    </UserControl.Resources>
	
	 <!-- Hier ein Container und zuweisen der Collection als Source-->
	<ListView ItemsSource="{Binding ToolTipGroups}"/>

Jetzt werden alle Objekte des ToolTipGroup-Typs mit dem StackPanel dargestellt. Das ist bei dir noch nicht genug, da ja die Collection weitere Listen enthält. Du mußt halt weiter verschachteln.

Da du offensichtlich nicht MVVM anwendest und ich auf der anderen Seite nicht Nicht-MVVM programmieren kann hoffe ich mal das dieser Lösungsansatz auch der richtige für dich ist.

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....

109 Beiträge seit 2011
vor 12 Jahren

Ich glaube mich zu erinnern das die Angabe des DataTemplates in den Resourcen in Silverlight nicht geht (sondern nur in Wpf). Deshalb hier noch mal eine SL-fähige Variante (-:


            <ListView ItemsSource="{Binding ToolTipGroups}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Key}" />
                            <TextBlock Text="{Binding Value}" />
                        </StackPanel>
                        <!-- Hier kann stattdessen auch ein UserControl angegeben werden:
             <Views:ToolTipGroupView/>-->
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Um Rekursion zu verstehen, muss man erst mal Rekursion verstehen, muss man erst mal Rekursion verstehen, ....