2009-06-04 21 views
18

Possiedo un'applicazione con oltre un centinaio di descrizioni diverse impostate su un controllo barra multifunzione. Tutte le descrizioni comandi sono visualizzate piuttosto rapidamente (circa mezzo secondo) e vorrei aumentare il ritardo del pop-up. Dopo alcune ricerche sembra che l'unico modo per farlo in WPF sia attraverso la proprietà ToolTipService.InitialShowDelay.Modificare la descrizione comando iniziale di InitialShowDelay a livello globale

La mia domanda è, devo passare attraverso il codice XAML e dire esplicitamente

ToolTipService.InitialShowDelay="2000" 

Per ogni singolo controllo che ha una descrizione comandi? O c'è un modo per impostare questa proprietà globalmente, usando qualcosa come uno stile?

Grazie per qualsiasi idea.

risposta

24

Sfortunatamente, non esiste un modo semplice per farlo. Idealmente, dovresti impostare ToolTipService.InitialShowDelay su FrameworkElement e lasciarlo propagare da lì, ma risulta che non sembra funzionare.

Invece, è possibile impostare su ogni tipo di controllo che si desidera impostare su, per esempio:

<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> 

ecc

Anche se questo è un modo piuttosto dettagliato di farlo , almeno devi solo impostarlo su ogni tipo di controllo e non su ogni controllo stesso - e se lo stai usando nella barra multifunzione, allora c'è solo una manciata di controlli per cominciare.

per risparmiare un po 'di fastidio dovrebbe mai voler cambiare il valore, si consiglia di architetto il codice qui sopra utilizzando un valore di risorsa:

<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> 

In alternativa, se non si è già utilizzando stili BasedOn, è potrebbe accorciare a:

<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}"/> 

Il limite di questo approccio è che uno stile può essere basata solo su uno stile principale, quindi se si sta già utilizzando questo modello, non sarà in grado di fare questo.

11

Ho incontrato lo stesso problema e ho raggiunto una soluzione apprezzabile. Due di loro, in realtà.

Entrambi sono basati sul sistema di metadati DependencyProperty. Per entrambi è necessario un codice di inizializzazione statico abbastanza simile:

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

Cosa succede invece di "..."?

La prima soluzione è abbastanza ovvia: posizionare il valore predefinito desiderato che si applicherà all'intera applicazione tranne i luoghi in cui viene fornito un valore reale.

La seconda soluzione è la più complessa: anziché "..." si fornisce il valore predefinito dai metadati predefiniti, ma a parte il fatto che si modificano le opzioni, in realtà è necessario rendere ereditabile la proprietà.

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

Quando la proprietà è ereditabile si possono fare cose come questa:

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

che farà il trucco per l'intera finestra o qualsiasi altro elemento si applica la proprietà.

HTH

7

mi piace la soluzione di archimed7592 ma non verrà eseguito da solo. Devi usare la classe in qualche modo per eseguire il suo costruttore statico. Così ho scelto di inserire questo codice nel costruttore statico della mia applicazione Classe di applicazione in questo modo:

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

E nel mio caso ho bisogno di impostare un'altra proprietà, ma idea è la stessa. Quindi non essere curioso.

3

La soluzione di Nicholas Armstrong è molto buona, ma lo stile di un FrameworkElement funziona se si imposta ToolTipService.IsEnabled su true.

Nel mio progetto ho uno stile commom per ogni campo e l'impostazione di ToolTip.InitialDelay c'era la cosa ragionevole da fare e non funzionava, quindi ho provato a ToolTip.IsEnabled e ha funzionato.

Esempio di seguito:

<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

Cerco una soluzione del genere (stile unico), ma senza dover assegnare chiave FieldStyle agli elementi. –

Problemi correlati