2009-06-04 11 views
18

Ich habe eine Anwendung, die nach oben von hundert verschiedenen ToolTips gesetzt auf einer Band Kontrolle hat. Alle QuickInfos erscheinen ziemlich schnell (ungefähr eine halbe Sekunde), und ich möchte die Popup-Verzögerung erhöhen. Nach einigen Nachforschungen scheint die einzige Möglichkeit, dies in WPF zu tun, die ToolTipService.InitialShowDelay-Eigenschaft zu sein.die Global InitialShowDelay Property Quick-Info Ändern

Meine Frage ist, kann ich durch die XAML gehen und sagen ausdrücklich

ToolTipService.InitialShowDelay="2000" 

Für jedes einzelne Steuerelement, das eine Quick-Info hat? Oder gibt es eine Möglichkeit, diese Eigenschaft global festzulegen, indem Sie etwas wie einen Style verwenden?

Danke für irgendwelche Ideen.

Antwort

24

Leider gibt es keine einfache Möglichkeit, dies zu tun. Im Idealfall würden Sie ToolTipService.InitialShowDelay auf FrameworkElement setzen und es von dort propagieren lassen, aber es stellt sich heraus, dass es nicht zu funktionieren scheint.

Stattdessen können Sie es auf jeden Typ eingestellt Kontrolle Sie wollen, es auf, zum Beispiel:

<Style TargetType="RibbonButton"> 
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/> 
</Style> 
<Style TargetType="RibbonToggleButton"> 
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/> 
</Style> 
<Style TargetType="RibbonDropDownButton"> 
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/> 
</Style> 

usw.

Obwohl dies eine ziemlich ausführliche Art und Weise ist, es zu tun zumindest haben Sie es auf jede Art von Kontrolle zu setzen und nicht jede Steuerung selbst - und wenn Sie es in der Band verwenden, dann gibt es nur eine Handvoll von Kontrollen zu beginnen.

sparen Sie sich einige Mühe sollten Sie jemals den Wert ändern möchten, können Sie den obigen Code zu Architekt mit einem Ressourcenwert wünschen können:

<sys:Int32 x:Key="ToolTipInitialShowDelay">2000</sys:Int32> 
<Style TargetType="RibbonButton"> 
    <Setter Property="ToolTipService.InitialShowDelay" 
      Value="{StaticResource ToolTipInitialShowDelay}"/> 
</Style> 
<Style TargetType="RibbonToggleButton"> 
    <Setter Property="ToolTipService.InitialShowDelay" 
      Value="{StaticResource ToolTipInitialShowDelay}"/> 
</Style> 
<Style TargetType="RibbonDropDownButton"> 
    <Setter Property="ToolTipService.InitialShowDelay" 
      Value="{StaticResource ToolTipInitialShowDelay}"/> 
</Style> 

Alternativ, wenn Sie nicht bereits mit BasedOn Designs, Sie verkürzen könnte es zu:

<Style x:Key="ToolTipDefaults"> 
    <Setter Property="ToolTipService.InitialShowDelay" Value="2000"/> 
</Style> 
<Style TargetType="RibbonButton" BasedOn="{StaticResource ToolTipDefaults}"/> 
<Style TargetType="RibbonToggleButton" BasedOn="{StaticResource ToolTipDefaults}"/> 
<Style TargetType="RibbonDropDownButton" BasedOn="{StaticResource ToolTipDefaults}"/> 

Die Einschränkung dieses Ansatzes ist, dass ein Stil nur auf einer übergeordneten Stil gestützt werden kann, so dass, wenn Sie bereits dieses Muster verwenden, werden Sie nicht das der Lage zu tun.

11

Ich habe in das gleiche Problem laufen und erreicht eine nennenswerte Lösung. Zwei von ihnen eigentlich.

auf DependencyProperty Metadatensystem Beide basieren. Für beide benötigen Sie einen ziemlich ähnlichen statischen Initialisierungscode:

public static class ToolTipServiceHelper 
{ 
    static ToolTipServiceHelper() 
    { 
     ToolTipService.InitialShowDelayProperty 
      .OverrideMetadata(typeof(FrameworkElement), 
           new FrameworkPropertyMetadata(...)); 
    } 
} 

Was geht anstelle von "..."?

Erste Lösung ist ziemlich offensichtlich: Ort gibt den Standardwert erwünscht, die außer Orte für die gesamte Anwendung gelten, wo ein tatsächlicher Wert vorgesehen ist.

Die zweite Lösung ist die knifflige Lösung: Statt "..." stellen Sie den Standardwert aus den Standardmetadaten bereit, aber abgesehen davon ändern Sie die Optionen, eigentlich müssen Sie die Eigenschaft vererben.

new FrameworkPropertyMetadata(
    ToolTipService.InitialShowDelayProperty.DefaultMetadata.DefaultValue, 
    FrameworkPropertyMetadataOptions.Inherits) 

Wenn die Eigenschaft ist vererbbar Sie Dinge wie diese machen können:

<Window xmlns="..." 
     ... 
     ToolTipService.InitialShowDelay="2000"> 
    ... 
</Window> 

, die den Trick für das gesamte Fenster oder jedes andere Element tun wenden Sie die Eigenschaft auf.

HTH

7

Ich mag die Lösung von archimed7592 aber es wird nicht von selbst laufen. Sie müssen die Klasse irgendwie verwenden, um ihren statischen Konstruktor auszuführen. Also habe ich wählen wie folgt diesen Code in statischen Konstruktor meiner Anwendung Anwendungsklasse zu platzieren:

static NetFriendApplication() 
    { 
     ToolTipService.ShowDurationProperty.OverrideMetadata(
      typeof (FrameworkElement), new FrameworkPropertyMetadata(int.MaxValue)); 
    } 

Und in meinem Fall muss ich eine andere Eigenschaft setzen, sondern Idee ist die gleiche. Sei also nicht neugierig.

3

Die Lösung von Nicholas Armstrong ist sehr gut, aber das Stylen eines FrameworkElement funktioniert, wenn Sie ToolTipService.IsEnabled auf true setzen.

In meinem Projekt habe ich einen Commom-Stil für jedes Feld und die Einstellung der ToolTip.InitialDelay gab es die vernünftige Sache zu tun und es hat nicht funktioniert, also habe ich es versucht, die ToolTip.IsEnabled und es hat funktioniert.

Beispiel unten:

<Style x:Key="FieldStyle" TargetType="FrameworkElement"> 
    <Setter Property="ToolTipService.ShowOnDisabled" Value="True"/> 
    <Setter Property="ToolTipService.ShowDuration" Value="20000"/> 
    <Setter Property="ToolTipService.InitialShowDelay" Value="3000"/> 
    <Setter Property="ToolTipService.IsEnabled" Value="True"/> 
</Style> 
+0

Ich suche nach einer Lösung, wie der (Stil nur), aber ohne FieldStyle Schlüssel Elemente zuweisen zu müssen. –

Verwandte Themen