WPF/C# GetFields() ToolTipProperty Reflection

Gast #6512541
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.
#6513532
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
Gast #6513617
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.
Gast #6545747
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.