2009-10-06 11 views
7

Domanda WPF rapida - su Win 7 (e presumo Vista) in WPF, la barra di avanzamento predefinita fa una bella animazione "whoosh".WPF/Windows 7: Disabilita la barra di avanzamento predefinita Glow Animation

Sto mostrando i progressi di circa 48 cose su uno schermo, ed è un po 'travolgente avere tutte queste cose che ti agitano - puoi disabilitare solo queste animazioni senza influenzare il resto delle animazioni predefinite nell'applicazione?

+11

@Matthew, cosa c'è di sbagliato nel mostrare 48 barre di avanzamento? Hai visto una cabina di pilotaggio in aereo? o il cruscotto dell'uomo meteo? o il cruscotto di qualsiasi macchina cnc? non ogni app è solo per programmatori e solo per i manager, penso che la risposta dovrebbe essere rilevante per la domanda piuttosto che dire alla persona di cambiare il suo design, sta facendo il suo lavoro e non ha fatto domande come è bello avere 48 progressi barre? –

+5

@Matthew, in questa applicazione sono appropriate 48 barre di avanzamento, in quanto visualizza informazioni su 48 dispositivi che sono fisicamente monitorati in tempo reale. Sarei d'accordo con te se fosse un'app LOB o qualcosa del genere. – Brandon

risposta

4

Sono d'accordo con il commento di Matteo, ma in ogni caso, la tua risposta è applicare uno stile personalizzato senza l'animazione. Ecco lo stile originale (via riflettore), è possibile rimuovere/Tweak/qualunque cosa:

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

E la classe convertitore:

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

Qualcuno ha effettivamente usato con successo questo? Non riesco nemmeno a compilare lo stile sopra riportato. –

3

È inoltre possibile disabilitare questo effetto in Win7 tutti insieme.

Fare clic con il tasto destro del mouse sull'icona Risorse del computer sul desktop e selezionare Proprietà (o premere il tasto Windows + tasto Pausa/Interruzione), fare clic sul collegamento Impostazioni avanzate di sistema nel riquadro di sinistra (È anche possibile aprirlo digitando sysdm.cpl in RUN o avvia la casella di ricerca del menu e premi Invio). Ora fai clic sul pulsante Impostazioni nella sezione Prestazioni:

Deseleziona "Anima controlli e elementi all'interno di finestre", dovrebbe essere la prima selezione.

+0

Grazie, in questo caso particolare, dovrebbe essere limitato solo all'applicazione (non si vuole fare affidamento su una modifica del tema del sistema operativo globale), ma buone informazioni – Brandon

6

La barra di avanzamento semplice, non animata può essere scritta come una griglia con due rettangoli pieni: quella sinistra verrebbe riempita, ad esempio, con il colore verde, quella destra con il grigio.

La griglia avrebbe due definizioni di colonna.

La modifica della larghezza dei due cambierà l'avanzamento.

10

risposta di Robert è robusto. Ecco un hack (perché si basa sul nome interno dell'elemento che fa il bagliore, che è un dettaglio di implementazione e possono cambiare in una versione successiva):

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

Se come una barra di avanzamento è implementato modifiche , questo hack potrebbe smettere di funzionare.

D'altra parte, una soluzione che sostituisce completamente XAML e stili può bloccare e correggere colori, bordi ecc. E disabilitare il comportamento che potrebbe essere aggiunto a una versione più recente di ProgressBar in futuro ...

0

Creare un collegamento all'applicazione in uso, fare clic con il tasto destro del mouse sul collegamento e scegliere Proprietà. Ora nella scheda compatibilità fai clic sulla casella di controllo "Disattiva temi visivi".

+0

Ciò influenzerà le altre animazioni nell'applicazione –

Problemi correlati