2009-06-04 16 views
18

Tengo una aplicación que tiene más de un centenar de ToolTips diferentes configurados en un control Ribbon. Todas las sugerencias de herramientas aparecen rápidamente (aproximadamente medio segundo) y me gustaría aumentar el retraso emergente. Después de algunas investigaciones, parece que la única forma de hacerlo en WPF es a través de la propiedad ToolTipService.InitialShowDelay.Cambiar la información sobre herramientas InitialShowDelay Propiedad globalmente

Mi pregunta es, ¿tengo que pasar por el XAML y decir explícitamente

ToolTipService.InitialShowDelay="2000" 

Por cada control único que tiene una información sobre herramientas? ¿O hay alguna forma de establecer esta propiedad globalmente, usando algo así como un Estilo?

Gracias por cualquier idea.

Respuesta

24

Desafortunadamente, no hay una manera fácil de hacerlo. Lo ideal sería establecer ToolTipService.InitialShowDelay en FrameworkElement y dejar que se propague desde allí, pero resulta que no parece funcionar.

En su lugar, se puede establecer para cada tipo de control que desea ponerlo en, por ejemplo:

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

etc.

Aunque esta es una forma bastante detallado de hacerlo , al menos, solo tiene que configurarlo en cada tipo de control y no en cada control en sí mismo, y si lo está utilizando en la cinta de opciones, entonces solo hay un puñado de controles para comenzar.

ahorrar un poco de molestia si alguna vez desee cambiar el valor, es posible que desee arquitecto el código anterior utilizando un valor de recurso:

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

Alternativamente, si no está ya utilizando estilos BasedOn, se podría acortarlo 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}"/> 

La limitación de este enfoque es que un estilo sólo puede basarse en un estilo padre, por lo que si usted ya está usando este patrón, usted no será capaz de hacer esto.

11

Me encontré con el mismo problema y logré una solución apreciable. Dos de ellos, en realidad.

Ambos están basados ​​en el sistema de metadatos DependencyProperty. Para ambos será necesario algún bastante similares en código de inicialización estática:

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

Lo que va en lugar de "..."?

La primera solución es bastante obvia: coloque allí el valor predeterminado deseado que se aplicará a toda la aplicación excepto lugares donde se proporciona un valor real.

La segunda solución es la más complicada: en lugar de "..." proporciona el valor predeterminado de los metadatos predeterminados, pero aparte de eso cambia las opciones, en realidad tiene que hacer que la propiedad sea heredable.

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

Cuando la propiedad es heredable puede hacer cosas como esta:

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

que va a hacer el truco para toda la ventana o cualquier otro elemento que se aplican a la propiedad.

HTH

7

me gusta la solución de archimed7592 pero no va a funcionar por sí mismo. Necesitas usar clase de alguna manera para ejecutar su constructor estático. Así que he optar por colocar este código en constructor estático de mi clase de aplicación aplicación como esta:

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

Y en mi caso tengo que configurar otra propiedad, pero la idea es la misma. Entonces no seas curioso

3

La solución de Nicholas Armstrong es muy buena, pero diseñar un FrameworkElement funciona si configura ToolTipService.IsEnabled en true.

En mi proyecto tengo un estilo común para cada campo y establezco la información sobre herramientas. InicialDelay fue lo razonable y no funcionó, así que lo intenté con la información sobre herramientas. Lo hice funcionar y funcionó.

Ejemplo a continuación:

<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

Busco a una solución de esa manera (estilo solamente) pero sin tener que asignar a los elementos clave FieldStyle. –

Cuestiones relacionadas