Tengo una aplicación que tiene más de un centenar de diferentes Descripciones de conjunto sobre una Cinta de control. Toda la información sobre herramientas de pop más rápidamente (alrededor de la mitad de un segundo), y me gustaría aumentar el pop-up de retraso. Después de algunas investigaciones parece que la única manera de hacer esto en WPF es a través de la ToolTipService.InitialShowDelay propiedad.

Mi pregunta es, ¿tengo que ir a través de la XAML y decir explícitamente

ToolTipService.InitialShowDelay="2000"

Para cada control que tiene una sugerencia? O hay alguna manera de establecer esta propiedad a nivel mundial, el uso de algo como un Estilo?

Gracias por todas las ideas.

InformationsquelleAutor Charlie | 2009-06-04

4 Comentarios

  1. 26

    Por desgracia, no hay ninguna manera fácil de hacer esto. Idealmente, tendría que establecer ToolTipService.InitialShowDelay en FrameworkElement y deje que se propagan a partir de ahí, pero resulta que no parece funcionar.

    Lugar, se puede establecer en cada tipo de control que se desea establecer 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 este es un poco más detallado manera de hacerlo, a menos que usted sólo tiene que configurar en cada tipo de control y no todo control de sí mismo – y si la vas a usar en la Cinta de opciones, luego hay sólo un puñado de los controles, para empezar.

    Para ahorrar un poco de molestia en caso de que quiera cambiar el valor, puede que desee arquitecto en el código anterior, utilizando un valor de recursos:

    <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 se está utilizando Barra de estilos, se puede reducir 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 estar basado en uno de los padres del estilo, así que si usted ya está usando este patrón, usted no será capaz de hacer esto.

  2. 12

    Me he topado con el mismo problema y lograr una apreciable solución. Dos de ellos, en realidad.

    Ambos de ellos están basados en DependencyProperty sistema de metadatos. Para ambos necesitarás algo bastante similar a la estática código de inicialización:

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

    Lo que va en lugar de «…»?

    Primera solución es bastante obvia: lugar no deseado valor predeterminado que se aplica a toda la aplicación, excepto los lugares en donde el valor real es siempre.

    La segunda solución es fácil: en lugar de «…» que proporcione valor predeterminado de metadatos predeterminados, pero aparte de eso de cambiar las opciones, en realidad, usted tiene que hacer que la propiedad heredable.

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

    Cuando la propiedad es heredable puedes hacer cosas como esta:

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

    Que va a hacer el truco para toda la ventana o cualquier otro elemento de aplicar la propiedad.

    HTH

  3. 8

    Me gusta la solución de archimed7592 pero no se ejecuta por sí mismo. Usted necesita para utilizar la clase de alguna manera a que se ejecute el constructor estático. Así que me he decide colocar este código en el constructor estático de mi solicitud de la clase de Aplicación como esta:

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

    Y en mi caso tengo que crear otra propiedad, pero la idea es la misma. Así que no seas curioso.

  4. 3

    La solución de Nicolás Armstrong es muy buena, pero el estilo de un FrameworkElement funciona si se establece la ToolTipService.IsEnabled a la verdad.

    En mi proyecto tengo una política de estilo para cada campo y ajuste de la Descripción.InitialDelay allí estaba la cosa razonable de hacer y no funcionó, así que me dio una oportunidad a la Descripción.IsEnabled 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>
    • Estoy buscando una solución como la que (sólo estilo) pero sin tener que asignar FieldStyle clave para los elementos.

Dejar respuesta

Please enter your comment!
Please enter your name here