2009-10-06 10 views
7

Pregunta rápida de WPF: en Win 7 (y supongo que Vista) en WPF, la barra de progreso predeterminada muestra una pequeña y brillante animación "whoosh".WPF/Windows 7: Desactiva la barra de progreso predefinida Glow Animation

que estoy mostrando el progreso de unos 48 cosas en una pantalla, y es una tarea abrumadora para tener todas estas cosas whooshing en que - se puede desactivar sólo estas animaciones sin afectar al resto de las animaciones por defecto en la aplicación?

+11

@Matthew, ¿qué hay de malo en mostrar 48 barras de progreso? ¿Has visto una cabina del airplan? o el tablero del hombre del clima? o el tablero de cualquier máquina CNC? No todas las aplicaciones es sólo para programadores y sólo para los administradores de TI, creo que la respuesta debe ser relevante a la pregunta en lugar de decirle a la persona a cambiar su diseño, que está haciendo su trabajo y que no ha pedido pregunta como ¿es bueno tener 48 progreso ¿barras? –

+5

@Matthew, en esta solicitud de 48 barras de progreso son apropiados, ya que muestra información sobre 48 dispositivos que físicamente están siendo monitorizados en tiempo real. Estoy de acuerdo con usted si se trata de una aplicación LOB o algo así. – Brandon

Respuesta

4

Estoy de acuerdo con el comentario de Matthew, pero de todos modos, su respuesta es aplicar un estilo personalizado sin la animación. Aquí está el estilo original (a través del reflector), puede quitar/pellizco/lo que sea:

<Style x:Key="{x:Type ProgressBar}" TargetType="{x:Type ProgressBar}"> 
    <Style.Triggers> 
     <Trigger Property="Orientation" Value="Vertical"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ProgressBar}"> 
         <Border Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="3" SnapsToDevicePixels="true"> 
          <Border BorderThickness="1,1,1,0" BorderBrush="#BEBEBE" CornerRadius="2"> 
           <Border BorderThickness="1" BorderBrush="#EFEFEF" CornerRadius="1"> 
            <DockPanel Name="PART_Track" Margin="0,0,0,1" LastChildFill="false"> 
             <Decorator Name="PART_Indicator" Dock="Bottom"> 
              <Rectangle LayoutTransform="{RotateTransform Angle=-90}"> 
               <Rectangle.Fill> 
                <MultiBinding Converter="{theme:ProgressBarBrushConverter}"> 
                 <Binding Path="Foreground" RelativeSource="{RelativeSource TemplatedParent}" /> 
                 <Binding Path="IsIndeterminate" RelativeSource="{RelativeSource TemplatedParent}" /> 
                 <Binding Path="ActualHeight" ElementName="PART_Indicator" /> 
                 <Binding Path="ActualWidth" ElementName="PART_Indicator" /> 
                 <Binding Path="ActualHeight" ElementName="PART_Track" /> 
                </MultiBinding> 
               </Rectangle.Fill> 
              </Rectangle> 
             </Decorator> 
            </DockPanel> 
           </Border> 
          </Border> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
    <Setter Property="Foreground" Value="{StaticResource [0] Ñ}" /> 
    <Setter Property="Background" Value="{DynamicResource {x:Static WindowBrush}}" /> 
    <Setter Property="BorderBrush" Value="#686868" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ProgressBar}"> 
       <Border Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="3" SnapsToDevicePixels="true"> 
        <Border BorderThickness="1,1,1,0" BorderBrush="#BEBEBE" CornerRadius="2"> 
         <Border BorderThickness="1" BorderBrush="#EFEFEF" CornerRadius="1"> 
          <DockPanel Name="PART_Track" Margin="1,0,0,1" LastChildFill="false"> 
           <Rectangle Name="PART_Indicator"> 
            <Rectangle.Fill> 
             <MultiBinding Converter="{theme:ProgressBarBrushConverter}"> 
              <Binding Path="Foreground" RelativeSource="{RelativeSource TemplatedParent}" /> 
              <Binding Path="IsIndeterminate" RelativeSource="{RelativeSource TemplatedParent}" /> 
              <Binding Path="ActualWidth" ElementName="PART_Indicator" /> 
              <Binding Path="ActualHeight" ElementName="PART_Indicator" /> 
              <Binding Path="ActualWidth" ElementName="PART_Track" /> 
             </MultiBinding> 
            </Rectangle.Fill> 
           </Rectangle> 
          </DockPanel> 
         </Border> 
        </Border> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Y la clase del convertidor:

public class ProgressBarBrushConverter : IMultiValueConverter 
{ 
// Methods 
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
{ 
    Type type = typeof(double); 
    if (((((values == null) || (values.Length != 5)) || ((values[0] == null) || (values[1] == null))) || (((values[2] == null) || (values[3] == null)) || ((values[4] == null) || !typeof(Brush).IsAssignableFrom(values[0].GetType())))) || ((!typeof(bool).IsAssignableFrom(values[1].GetType()) || !type.IsAssignableFrom(values[2].GetType())) || (!type.IsAssignableFrom(values[3].GetType()) || !type.IsAssignableFrom(values[4].GetType())))) 
    { 
     return null; 
    } 
    Brush brush = (Brush) values[0]; 
    bool flag = (bool) values[1]; 
    double d = (double) values[2]; 
    double num2 = (double) values[3]; 
    double num3 = (double) values[4]; 
    if ((((d <= 0.0) || double.IsInfinity(d)) || (double.IsNaN(d) || (num2 <= 0.0))) || (double.IsInfinity(num2) || double.IsNaN(num2))) 
    { 
     return null; 
    } 
    DrawingBrush brush2 = new DrawingBrush(); 
    brush2.Viewport = brush2.Viewbox = new Rect(0.0, 0.0, d, num2); 
    brush2.ViewportUnits = brush2.ViewboxUnits = BrushMappingMode.Absolute; 
    brush2.TileMode = TileMode.None; 
    brush2.Stretch = Stretch.None; 
    DrawingGroup group = new DrawingGroup(); 
    DrawingContext context = group.Open(); 
    double x = 0.0; 
    double width = 6.0; 
    double num6 = 2.0; 
    double num7 = width + num6; 
    if (flag) 
    { 
     int num8 = (int) Math.Ceiling((double) (d/num7)); 
     double num9 = -num8 * num7; 
     double num10 = d * 0.3; 
     brush2.Viewport = brush2.Viewbox = new Rect(num9, 0.0, num10 - num9, num2); 
     TranslateTransform transform = new TranslateTransform(); 
     double num11 = num8 * 100; 
     DoubleAnimationUsingKeyFrames animation = new DoubleAnimationUsingKeyFrames(); 
     animation.Duration = new Duration(TimeSpan.FromMilliseconds(num11)); 
     animation.RepeatBehavior = RepeatBehavior.Forever; 
     for (int i = 1; i <= num8; i++) 
     { 
      double num13 = i * num7; 
      animation.KeyFrames.Add(new DiscreteDoubleKeyFrame(num13, KeyTime.Uniform)); 
     } 
     transform.BeginAnimation(TranslateTransform.XProperty, animation); 
     brush2.Transform = transform; 
     while ((x + width) < num10) 
     { 
      context.DrawRectangle(brush, null, new Rect(num9 + x, 0.0, width, num2)); 
      x += num7; 
     } 
     d = num10; 
     x = 0.0; 
    } 
    while ((x + width) < d) 
    { 
     context.DrawRectangle(brush, null, new Rect(x, 0.0, width, num2)); 
     x += num7; 
    } 
    double num14 = d - x; 
    if ((!flag && (num14 > 0.0)) && (Math.Abs((double) (d - num3)) < 1E-05)) 
    { 
     context.DrawRectangle(brush, null, new Rect(x, 0.0, num14, num2)); 
    } 
    context.Close(); 
    brush2.Drawing = group; 
    return brush2; 
} 

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
{ 
    return null; 
} 
} 
+1

¿Alguien realmente ha utilizado esto con éxito? Ni siquiera puedo obtener el estilo anterior para compilar. –

3

También puede desactivar este efecto en Win7 todos juntos.

Haga clic derecho en el ícono Mi PC en el Escritorio y seleccione Propiedades (o presione la tecla Windows + Pausa/Tecla Quitar), haga clic en Configuración avanzada del sistema en el panel lateral izquierdo (También puede abrir escribiendo sysdm.cpl en EJECUTAR o iniciar el cuadro de búsqueda del menú y presionar Enter). Ahora haga clic en el botón Configuración en la sección Rendimiento:

Desmarque "Animar los controles y elementos dentro de las ventanas", debería ser la primera opción.

+0

Gracias, en este caso particular, debe limitarse a la aplicación solamente (no desea confiar en un cambio de tema de sistema operativo global), pero buena información – Brandon

6

El simple, barra de progreso no animado se puede escribir como una cuadrícula con dos rectángulos rellenos: el de la izquierda se llenaría, por ejemplo, con el color verde, el más adecuado de gris.

The Grid tendría dos definiciones de columna.

Cambiando el ancho de los dos hará un efecto de cambio del progreso.

10

respuesta de Robert es robusto. Aquí es un truco (porque se basa en el nombre interno del elemento que hace el brillo, el cual es un detalle de implementación y puede cambiar en una versión posterior):

void SetGlowVisibility(ProgressBar progressBar, Visibility visibility) { 
    var glow = progressBar.Template.FindName("PART_GlowRect", progressBar) as FrameworkElement; 
    if (glow != null) glow.Visibility = visibility; 
} 

Si la forma de una barra de progreso se implementa cambios , este truco puede dejar de funcionar.

Por otro lado, una solución que reemplaza por completo el XAML y los estilos puede bloquear y corregir colores, bordes, etc. y deshabilitar el comportamiento que podría agregarse a una versión más nueva de ProgressBar en el futuro ...

0

Crea un acceso directo a la aplicación que estás usando, haz clic derecho en el acceso directo y elige propiedades. Ahora en la pestaña de compatibilidad, haga clic en la casilla "deshabilitar temas visuales".

+0

Esto afectará a las otras animaciones en la aplicación –

Cuestiones relacionadas