Forum: PC-Programmierung WPF/C# GetFields() ToolTipProperty Reflection


von Guelay (Gast)


Lesenswert?

Hallo Zusammen,

es geht um folgende Codezeile:
1
 AssociatedObject.SetValue(FrameworkElement.ToolTipProperty, e);

Das AssociatedObject ist ein Button. Ich möchte das IsOpen von 
ToolTipProperty mit true überschreiben. Mit 
FrameworkElement.ToolTipProperty.OwnerType.GetFields.Single(x => x.Name 
== "IsOpenProperty") kann ich auf FieldInfo zugreifen. Jedoch weiss ich 
nicht mehr wie ich dieses Property auf true setzen soll.

von Dirk K. (merciless)


Lesenswert?

Darf ich fragen, warum du dafür Reflection bemühst?
Du bist doch ein Anfänger in Sachen C# wenn ich micht
recht an deinen Nicknamen erinnere. Und Reflection
ist das letzte, was ich einem Rookie empfehlen würde.
Da gibt es normalerweise auch einen "sauberen" Weg,
das Problem zu lösen.

merciless

von guelay (Gast)


Lesenswert?

Dirk K. schrieb:
> Darf ich fragen, warum du dafür Reflection bemühst?
> Du bist doch ein Anfänger in Sachen C# wenn ich micht
> recht an deinen Nicknamen erinnere. Und Reflection
> ist das letzte, was ich einem Rookie empfehlen würde.
> Da gibt es normalerweise auch einen "sauberen" Weg,
> das Problem zu lösen.
>
> merciless

1. kein Anfänger.
2. schon erledigt.

von T.W. (Gast)


Lesenswert?

Guten Tag,

da du ja deine gefundene Lösung nicht veröffentlicht hast, würde ich das 
hier gerne nachholen, damit jemand anderes eventuell auch etwas mit der 
Lösung anfangen kann.
Warum du genau über Reflection arbeiten willst, kann ich mir 
ehrlichgesagt nicht genau erklären - manchmal gibt es dafür Gründe (z.B. 
Manipulationen an Paketen, die vom Zugang sehr beschränkt sind), aber 
oft existieren auch andere Wege, um zum gewünschten Ziel zu kommen.

Meine primäre Vermutung ist, dass du hier versuchst, dem Button eine 
Control als ToolTip zuzuweisen und diesen programmatisch zu öffnen. Dein 
Fehler wird vermutlich darin liegen, dass du der "ToolTip"-Property des 
Buttons direkt die besagte Control zuweist, anstatt diese in einen 
ToolTip (eine ContentControl extra zu diesem Zweck) zu wrappen:
1
ToolTip toolTip = new ToolTip()
2
{
3
    // Content kann hier beliebig gesetzt werden, z.B.
4
    // Content = "Das steht im ToolTip"
5
6
    Content = new TextBlock()
7
    {
8
        Text = "Das steht im ToolTip"
9
    }
10
};
11
12
AssociatedObject.SetValue(ToolTipProperty, toolTip);
13
// AssociatedObject.ToolTip = toolTip; // Das funktioniert uebrigens auch

Wenn du jetzt später auf den ToolTip zugreifen willst, kannst du 
folgende Syntax verwenden:
1
if (AssociatedObject.ToolTip is ToolTip _toolTip)
2
    _toolTip.IsOpen = true;

Willst du außerdem noch Position und Anzeigedauer des ToolTips 
manipulieren, so kannst du mit den anderen Properties von ToolTip 
arbeiten:
1
if (AssociatedObject.ToolTip is ToolTip _toolTip)
2
{
3
    // setzt das UIElement, worauf sich die Position bezieht
4
    _toolTip.PlacementTarget = AssociatedObject; 
5
6
    // setzt die "Richtung" der Positionierung: in diesem Fall unter dem "Target"
7
    _toolTip.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
8
9
    // ist diese Property true, so schliesst der ToolTip erst nach dem naechsten Click des Nutzers
10
    _toolTip.StaysOpen = true;
11
12
    _toolTip.IsOpen = true;
13
}

Begründung:
Wie du eventuell siehst, hat
1
FrameworkElement.ToolTip
 den Typ
1
object
. Direkte Zuweisungen zum gewünschten "Content" sind also erlaubt (in 
dem Fall kümmert sich, soweit ich das verstanden habe, eine interne 
ContentControl um die Darstellung). Gleichzeitig gibt man damit aber 
auch ein Stück weit die Kontrolle ab, die du (so vermute ich) über 
Reflection zurückgewinnen wolltest.

Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.