2009-10-06 4 views
7

Schnelle WPF-Frage - auf Win 7 (und ich nehme an, Vista) in WPF, die Standard-Fortschrittsbalken macht eine nette kleine leuchtende "Whoosh" -y-Animation.WPF/Windows 7: Standard-Fortschrittsleiste deaktivieren Glow Animation

Ich zeige Fortschritte von ungefähr 48 Sachen auf einem Bildschirm, und es ist ein bisschen überwältigend, all diese Dinge auf dich zu haben - kannst du nur diese Animationen deaktivieren, ohne den Rest der Standardanimationen in der Anwendung zu beeinflussen?

+11

@Matthew, was ist falsch bei 48 Fortschrittsbalken? Hast du ein Airplan-Cockpit gesehen? oder Wettermanns Armaturenbrett? oder irgendein cnc-Maschine Dashboard? nicht jede app ist nur für programmierer und nur für sie manager, ich denke die antwort sollte relevant für die frage sein, anstatt der person mitzuteilen, dass sie sein design ändert, er macht seine arbeit und er hat keine frage gestellt wie ist es gut, 48 Fortschritte zu haben Riegel? –

+5

@Matthew, in dieser Anwendung sind 48 Fortschrittsbalken geeignet, da sie Informationen über 48 Geräte anzeigt, die in Echtzeit physikalisch überwacht werden. Ich würde dir zustimmen, wenn dies eine LOB-App oder etwas anderes wäre. – Brandon

Antwort

4

Ich stimme Matthews Kommentar zu, aber Ihre Antwort ist, einen benutzerdefinierten Stil ohne die Animation anzuwenden. Hier ist der ursprüngliche Stil (mit Reflektor), können Sie entfernen/zwicken/was auch immer:

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

Und die Konverter-Klasse:

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

Hat jemand das wirklich erfolgreich benutzt? Ich kann den obigen Stil nicht einmal kompilieren. –

3

Sie diesen Effekt auch in Win7 alle zusammen deaktivieren.

Klicken Sie mit der rechten Maustaste auf Arbeitsplatz auf dem Desktop und wählen Sie Eigenschaften (oder drücken Sie Windows Taste + Pause/Pause), klicken Sie auf Erweiterte Systemeinstellungen im linken Bereich (Sie können es auch öffnen, indem Sie sysdm.cpl in eingeben RUN oder Startmenü Suchfeld und drücken Sie Enter). Klicken Sie nun im Bereich "Leistung" auf die Schaltfläche "Einstellungen":

Deaktivieren Sie "Steuerelemente und Elemente in Fenstern animieren". Dies sollte die erste Auswahl sein.

+0

Danke, in diesem speziellen Fall sollte es auf die Anwendung beschränkt werden (nicht auf ein globales Betriebssystem Thema Änderung verlassen wollen), aber gute info – Brandon

6

Der einfache, nicht animierte Fortschrittsbalken kann als Gitter mit zwei gefüllten Rechtecken geschrieben werden: der linke wäre gefüllt, etwa mit grüner Farbe, der rechte mit grauer Farbe.

Das Gitter hätte zwei Spaltendefinitionen.

Wenn Sie die Breite der beiden ändern, wirkt sich dies auf die Änderung des Fortschritts aus.

10

Robert Antwort robust ist. Hier ist ein Hack (weil es auf dem internen Namen des Elements beruht, die das Leuchten der Fall ist, die eine Implementierung Detail und kann in einer späteren Version ändern):

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

Wenn, wie ein Fortschrittsbalken Änderungen implementiert , könnte dieser Hack aufhören zu arbeiten.

Auf der anderen Seite kann eine Lösung, die XAML und Stile vollständig ersetzt, Farben, Rahmen usw. sperren und fixieren und das Verhalten deaktivieren, das in Zukunft zu einer neueren Version der ProgressBar hinzugefügt werden könnte.

0

Erstellen Sie eine Verknüpfung zu der Anwendung, die Sie verwenden, klicken Sie mit der rechten Maustaste auf die Verknüpfung, und wählen Sie Eigenschaften. Jetzt in der Kompatibilitäts-Registerkarte klicken Sie auf das Kontrollkästchen "Visual Designs deaktivieren".

+0

Dies wird die anderen Animationen in der Anwendung auswirken –