Laden...

Eigenes Tempate für Validation-Tooltip

Erstellt von sugar76 vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.038 Views
S
sugar76 Themenstarter:in
69 Beiträge seit 2017
vor 5 Jahren
Eigenes Tempate für Validation-Tooltip

Hallo allerseits,

ich möchte gerne Validierungsfehler in einem Tooltip anzeigen. Hierzu verwende ich einen Style.

Mache ich das wie folgt, gibt es keine Probleme - der Tooltip wird mitsamt Fehlermeldung angezeigt:


<Style x:Key="ValidatingControlStyle" TargetType="{x:Type FrameworkElement}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
            </Trigger>
        </Style.Triggers>
</Style>

Jetzt möchte ich gerne das Aussehen des Tooltips ändern. Hierzu verwende ich ein Template. Der Tooltip wird mit dem Template auch korrekt gerendert, nur wird die Fehlermeldung nicht mehr angezeigt. Der Tooltip ist leer.


<Style x:Key="ValidatingControlStyle" TargetType="{x:Type FrameworkElement}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip">
                    <Setter.Value>
                        <ToolTip Content="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"> <!-- Text wird nicht angezeigt -->
<!--                    <ToolTip Content="Das ist ein Text"> Text wird angezeigt -->
                            <ToolTip.Template>
                                <ControlTemplate TargetType="ToolTip">
                                    <Border BorderBrush="Blue" BorderThickness="1" 
                                            Background="AliceBlue"
                                            CornerRadius="5">
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{TemplateBinding Content}"
                                                       Margin="10"
                                                       Width="150" 
                                                       TextWrapping="Wrap"/>
                                        </StackPanel>
                                    </Border>
                                </ControlTemplate>
                            </ToolTip.Template>
                        </ToolTip>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
</Style>

Die entscheidende Stelle ist

<ToolTip Content="{Binding Path=(Validation.Errors)[0].ErrorContent}">

Schreibe ich in die Content-Property irgendeinen beliebigen Text rein (siehe Kommentar im obigen XML), wird dieser angezeigt.

Hat jemand eine Idee, wie man das Tooltip dazu bringen kann, die Validation-Message anzuzeigen?

Gruß 🙂

5.658 Beiträge seit 2006
vor 5 Jahren

Hi sugar76,

versuch es mal mit jeweils einem Setter für ToolTip.Content und ToolTip.Template.

Oder einen eigenen Style für den ToolTip.

Weeks of programming can save you hours of planning

S
sugar76 Themenstarter:in
69 Beiträge seit 2017
vor 5 Jahren

Sorry, hatte ein paar andere Dinge zu tun, komme erst jetzt dazu.

Also, versuche ich folgendes:

<Style x:Key="ValidatingControlStyle" TargetType="{x:Type FrameworkElement}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip.Template">
                    <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ToolTip}">
                                <Border BorderBrush="Blue" BorderThickness="1"
                                            Background="AliceBlue"
                                            CornerRadius="5">
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{TemplateBinding Content}"
                                                       Margin="10"
                                                       Width="150"
                                                       TextWrapping="Wrap"/>
                                    </StackPanel>
                                </Border>
                            </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="ToolTip.Content" Value="{Binding Path=(Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" />
            </Trigger>
        </Style.Triggers>
/Style>

... erhalte ich beim Öffnen des zugehörigen Dialogs zur Laufzeit einen Fehler, den ich nicht recht verstehe:> Fehlermeldung:

TargetType 'ToolTip'" für "ControlTemplate" stimmt nicht mit dem als Vorlage verwendeten Typ "TextBox" überein

Das Element, bei dem die Validierungsnachricht angezeigt wird, ist vom Typ TextBox. Versucht die Rendering-Engine, das Template auf die TextBox anwenden ...?

Naja, ich werds weiter versuchen ...

Hinweis von Abt vor 5 Jahren

Bitte Error Tags verwenden; nicht irgendwelche.

Und bitte beachte [Hinweis] Wie poste ich richtig? - keine Full Quotes.

5.658 Beiträge seit 2006
vor 5 Jahren

Es scheint etwas komplizierter zu sein. Das hier hab ich dazu gefunden: Custom ToolTip template for some elements, ist aber auch keine gute Lösung.

Ich würde statt dessen mal folgendes versuchen:

  • Den Tooltip möglichst unabhängig von der Implementierung der Textbox definieren, z.B.:
  • Einen Style für den Error-ToolTip anzulegen, und dann im Setter nur diesen Style anstatt das ganze Template zuzuweisen.
  • Mehrere Trigger für ToolTip.Style/ToolTip.Template und ToolTip/ToolTip.Content
  • ein bißchen experimentieren, was funktioniert und was nicht

Weeks of programming can save you hours of planning

S
sugar76 Themenstarter:in
69 Beiträge seit 2017
vor 5 Jahren

Ich hab's hingekriegt 😄, Lösung habe ich hier gefunden: https://wpf.2000things.com/2011/08/30/375-binding-something-in-a-tooltip-to-a-property-on-the-parent-control/

Das Geheimnis ist: man muss den DataContext des Tooltips auf das Element setzen, welches den Tooltip anzeigt und die Fehlermeldung enthält (also in meinen Fall die TextBox). Das gesuchte Element ist der PlacementTarget des Tooltips. Die Bindings im Template gehen dann alle auf diesen DataContext.
Das Ganze sieht dann so aus:

<Style x:Key="ValidatingControlStyle" TargetType="{x:Type FrameworkElement}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip">
                    <Setter.Value>
                        <ToolTip DataContext="{Binding Path=PlacementTarget, RelativeSource={x:Static RelativeSource.Self}}">
                            <ToolTip.Template>
                                <ControlTemplate TargetType="ToolTip">
                                    <Border BorderBrush="Blue" BorderThickness="1"
                                            Background="AliceBlue"
                                            CornerRadius="5">
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding (Validation.Errors)[0].ErrorContent}"
                                                       Margin="10"
                                                       Width="150"
                                                       TextWrapping="Wrap"/>
                                        </StackPanel>
                                    </Border>
                                </ControlTemplate>
                            </ToolTip.Template>
                        </ToolTip>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
</Style>