2009-12-09 12 views
7

Estoy usando la barra de progreso de WPF y establezco el valor hasta el valor máximo. Pero, cuando se alcanza, la animación (ese es el efecto verde) continúa.WPF Progressbar continue animation

¿Cómo puedo detenerlo y tener una barra verde llena, sin ninguna animación?

por ejemplo, tomar este:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Grid> 
     <ProgressBar Height="30" Name="progressBar1" VerticalAlignment="Top" Minimum="0" Maximum="100" /> 
    </Grid> 
</Window> 

y:

public partial class Window1 : Window 
{ 
    private double _min; 
    private double _max; 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     _min = progressBar1.Minimum; 
     _max = progressBar1.Maximum; 
     Thread thread = new Thread(Start); 
     thread.Start(); 
    } 

    private void Start() 
    { 
     for (double i = _min; i <= _max; i++) 
     { 
      Thread.Sleep(50); 
      double value = i; 
      Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => progressBar1.Value = value)); 
     } 
    } 
} 

Cuando hilo ha terminado, siempre puedo visualizar la animación en la barra de progreso (el efecto de blanco en la barra verde)

Gracias de antemano por su ayuda

Respuesta

2

no estoy del todo seguro de lo que yo Es decir, pero quizás lo que necesita es establecer la propiedad IsIndeterminate de ProgressBar en falso. Si eso no funciona, ¡por favor denos un código para ayudarlo!

EDITAR: La animación es parte del estilo Aero de Windows y algunos diseñadores pagaron mucho dinero para ... ¡err desgin it! Entonces no puedes simplemente eliminar la animación usando una propiedad. Puede modificar la apariencia visual de ProgressBars existente editando su controltemplate. A continuación se muestra toda la plantilla de control de WPF ProgressBar. Mente: necesitas todos los recursos, la referencia xmlns a Window.Themes y debes establecer una referencia a PresentationFramwork.Aero dll. Inserté un comentario donde puedes hacer el cambio. Cambie el color FF000000 a 00000000 en el segundo y tercer gradientstops y el brillo blanco desaparecerá. Traté de implementar un disparador que mostrará la animación al principio, pero la detiene cuando Valor == Máximo, pero fallé. ¿Alguien más?

<Window x:Class="BlandProgressBarSpike.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
    Title="Window1" Height="300" Width="300" 
    Loaded="Window_Loaded"> 
    <Window.Resources> 
     <LinearGradientBrush x:Key="ProgressBarBackground" EndPoint="1,0" StartPoint="0,0"> 
      <GradientStop Color="#BABABA" Offset="0"/> 
      <GradientStop Color="#C7C7C7" Offset="0.5"/> 
      <GradientStop Color="#BABABA" Offset="1"/> 
     </LinearGradientBrush> 
     <LinearGradientBrush x:Key="ProgressBarBorderBrush" EndPoint="0,1" StartPoint="0,0"> 
      <GradientStop Color="#B2B2B2" Offset="0"/> 
      <GradientStop Color="#8C8C8C" Offset="1"/> 
     </LinearGradientBrush> 
     <LinearGradientBrush x:Key="ProgressBarGlassyHighlight" EndPoint="0,1" StartPoint="0,0"> 
      <GradientStop Color="#50FFFFFF" Offset="0.5385"/> 
      <GradientStop Color="#00FFFFFF" Offset="0.5385"/> 
     </LinearGradientBrush> 
     <LinearGradientBrush x:Key="ProgressBarTopHighlight" EndPoint="0,1" StartPoint="0,0"> 
      <GradientStop Color="#80FFFFFF" Offset="0.05"/> 
      <GradientStop Color="#00FFFFFF" Offset="0.25"/> 
     </LinearGradientBrush> 
     <!-- This produces the whitish,moving glow--> 
     <LinearGradientBrush x:Key="ProgressBarIndicatorAnimatedFill" EndPoint="0,0" StartPoint="-100,0" MappingMode="Absolute"> 
      <GradientStop Color="#00000000" Offset="0"/> 
      <GradientStop Color="#FF000000" Offset="0.4"/> 
      <GradientStop Color="#FF000000" Offset="0.6"/> 
      <GradientStop Color="#00000000" Offset="1"/> 
     </LinearGradientBrush> 
     <LinearGradientBrush x:Key="ProgressBarIndicatorDarkEdgeLeft" EndPoint="1,0" StartPoint="0,0"> 
      <GradientStop Color="#0C000000" Offset="0"/> 
      <GradientStop Color="#20000000" Offset="0.3"/> 
      <GradientStop Color="#00000000" Offset="1"/> 
     </LinearGradientBrush> 
     <LinearGradientBrush x:Key="ProgressBarIndicatorDarkEdgeRight" EndPoint="1,0" StartPoint="0,0"> 
      <GradientStop Color="#00000000" Offset="0"/> 
      <GradientStop Color="#20000000" Offset="0.7"/> 
      <GradientStop Color="#0C000000" Offset="1"/> 
     </LinearGradientBrush> 
     <RadialGradientBrush x:Key="ProgressBarIndicatorLightingEffectLeft" RelativeTransform="1,0,0,1,0.5,0.5" RadiusX="1" RadiusY="1"> 
      <GradientStop Color="#60FFFFC4" Offset="0"/> 
      <GradientStop Color="#00FFFFC4" Offset="1"/> 
     </RadialGradientBrush> 
     <LinearGradientBrush x:Key="ProgressBarIndicatorLightingEffect" EndPoint="0,0" StartPoint="0,1"> 
      <GradientStop Color="#60FFFFC4" Offset="0"/> 
      <GradientStop Color="#00FFFFC4" Offset="1"/> 
     </LinearGradientBrush> 
     <RadialGradientBrush x:Key="ProgressBarIndicatorLightingEffectRight" RelativeTransform="1,0,0,1,-0.5,0.5" RadiusX="1" RadiusY="1"> 
      <GradientStop Color="#60FFFFC4" Offset="0"/> 
      <GradientStop Color="#00FFFFC4" Offset="1"/> 
     </RadialGradientBrush> 
     <LinearGradientBrush x:Key="ProgressBarIndicatorGlassyHighlight" EndPoint="0,1" StartPoint="0,0"> 
      <GradientStop Color="#90FFFFFF" Offset="0.5385"/> 
      <GradientStop Color="#00FFFFFF" Offset="0.5385"/> 
     </LinearGradientBrush> 
     <Style x:Key="BlandStyle" TargetType="{x:Type ProgressBar}"> 
      <Setter Property="Foreground" Value="#01D328"/> 
      <Setter Property="Background" Value="{StaticResource ProgressBarBackground}"/> 
      <Setter Property="BorderBrush" Value="{StaticResource ProgressBarBorderBrush}"/> 
      <Setter Property="BorderThickness" Value="1"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ProgressBar}"> 
         <Grid SnapsToDevicePixels="true" x:Name="Background"> 
          <Rectangle Fill="{TemplateBinding Background}" RadiusX="2" RadiusY="2"/> 
          <Border Margin="1" Background="{StaticResource ProgressBarGlassyHighlight}" CornerRadius="2"/> 
          <Border Margin="1" Background="{StaticResource ProgressBarTopHighlight}" BorderBrush="#80FFFFFF" BorderThickness="1,0,1,1"/> 
          <Rectangle Margin="1" x:Name="PART_Track"/> 
          <Decorator HorizontalAlignment="Left" Margin="1" x:Name="PART_Indicator"> 
           <Grid x:Name="Foreground"> 
            <Grid.RowDefinitions> 
             <RowDefinition/> 
             <RowDefinition/> 
            </Grid.RowDefinitions> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition MaxWidth="15"/> 
             <ColumnDefinition Width="0.1*"/> 
             <ColumnDefinition MaxWidth="15"/> 
            </Grid.ColumnDefinitions> 
            <Rectangle x:Name="Indicator" Fill="{TemplateBinding Foreground}" Grid.ColumnSpan="3" Grid.RowSpan="2"/> 
            <Rectangle x:Name="Animation" Fill="{TemplateBinding Foreground}" Grid.ColumnSpan="3" Grid.RowSpan="2"> 
             <Rectangle.OpacityMask> 
              <MultiBinding> 
               <MultiBinding.Converter> 
                <Microsoft_Windows_Themes:ProgressBarHighlightConverter/> 
               </MultiBinding.Converter> 
               <Binding Source="{StaticResource ProgressBarIndicatorAnimatedFill}"/> 
               <Binding Path="ActualWidth" ElementName="Background"/> 
               <Binding Path="ActualHeight" ElementName="Background"/> 
              </MultiBinding> 
             </Rectangle.OpacityMask> 
            </Rectangle> 
            <Rectangle Margin="1,1,0,1" x:Name="LeftDark" Fill="{StaticResource ProgressBarIndicatorDarkEdgeLeft}" RadiusX="1" RadiusY="1" Grid.RowSpan="2"/> 
            <Rectangle Margin="0,1,1,1" x:Name="RightDark" Fill="{StaticResource ProgressBarIndicatorDarkEdgeRight}" RadiusX="1" RadiusY="1" Grid.Column="2" Grid.RowSpan="2"/> 
            <Rectangle x:Name="LeftLight" Fill="{StaticResource ProgressBarIndicatorLightingEffectLeft}" Grid.Column="0" Grid.Row="2"/> 
            <Rectangle x:Name="CenterLight" Fill="{StaticResource ProgressBarIndicatorLightingEffect}" Grid.Column="1" Grid.Row="2"/> 
            <Rectangle x:Name="RightLight" Fill="{StaticResource ProgressBarIndicatorLightingEffectRight}" Grid.Column="2" Grid.Row="2"/> 
            <Border x:Name="Highlight1" Grid.ColumnSpan="3" Grid.RowSpan="2" Background="{StaticResource ProgressBarIndicatorGlassyHighlight}"/> 
            <Border x:Name="Highlight2" Grid.ColumnSpan="3" Grid.RowSpan="2" Background="{StaticResource ProgressBarTopHighlight}"/> 
           </Grid> 
          </Decorator> 
          <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2"/> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="Orientation" Value="Vertical"> 
           <Setter Property="LayoutTransform" TargetName="Background"> 
            <Setter.Value> 
             <RotateTransform Angle="-90"/> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="LayoutTransform" TargetName="PART_Track"> 
            <Setter.Value> 
             <RotateTransform Angle="90"/> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="LayoutTransform" TargetName="PART_Indicator"> 
            <Setter.Value> 
             <RotateTransform Angle="90"/> 
            </Setter.Value> 
           </Setter> 
           <Setter Property="LayoutTransform" TargetName="Foreground"> 
            <Setter.Value> 
             <RotateTransform Angle="-90"/> 
            </Setter.Value> 
           </Setter> 
          </Trigger> 
          <Trigger Property="IsIndeterminate" Value="true"> 
           <Setter Property="Visibility" TargetName="LeftDark" Value="Collapsed"/> 
           <Setter Property="Visibility" TargetName="RightDark" Value="Collapsed"/> 
           <Setter Property="Visibility" TargetName="LeftLight" Value="Collapsed"/> 
           <Setter Property="Visibility" TargetName="CenterLight" Value="Collapsed"/> 
           <Setter Property="Visibility" TargetName="RightLight" Value="Collapsed"/> 
           <Setter Property="Visibility" TargetName="Indicator" Value="Collapsed"/> 
          </Trigger> 
          <Trigger Property="IsIndeterminate" Value="false"> 
           <Setter Property="Fill" TargetName="Animation" Value="#80B5FFA9"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 
    <StackPanel> 
     <ProgressBar Style="{StaticResource BlandStyle}" Value="{Binding Progress}" Height="30" 
        Minimum="0" Maximum="100"/> 
    </StackPanel>   
</Window> 
+0

IsIndeterminate establecido en false no soluciona mi problema he editado con un ejemplo de código – Tim

+0

esto es una buena idea ... he usado un truco, un tiro de la barra como mapa de bits, y reemplazar con imagen cuando esté terminado. Uggly, pero funciona :) – Tim

+0

¡Siempre que la barra de progreso no cambie de tamaño, es una buena solución! – Dabblernl

0

Creo que es una característica de Windows Aero ... todas las barras de progreso tienen este efecto, no creo que se puede detener ...

1

coincidieron en que la animación de "brillo" es confuso para algunos usuarios. PUEDE eliminarse sin destruir la funcionalidad IsIndeterminate que hace la respuesta de Dabblernl: s.

Usando el estilo Aero que se puede encontrar en Dabblernl: s post que sustituye:

<Rectangle x:Name="Animation" Fill="{TemplateBinding Foreground}" Grid.ColumnSpan="3" Grid.RowSpan="2"> 
    <Rectangle.OpacityMask> 
    <MultiBinding> 
     <MultiBinding.Converter> 
     <Microsoft_Windows_Themes:ProgressBarHighlightConverter/> 
     </MultiBinding.Converter> 
     <Binding Source="{StaticResource ProgressBarIndicatorAnimatedFill}"/> 
     <Binding Path="ActualWidth" ElementName="Background"/> 
     <Binding Path="ActualHeight" ElementName="Background"/> 
    </MultiBinding> 
    </Rectangle.OpacityMask> 
</Rectangle> 

con:

<Rectangle x:Name="Animation" Grid.ColumnSpan="3" Fill="{TemplateBinding Foreground}" Grid.RowSpan="2"> 
    <Rectangle.OpacityMask> 
    <MultiBinding> 
     <MultiBinding.Converter> 
     <converters:ProgressBarHighlightOverrideConverter/> 
     </MultiBinding.Converter> 
     <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Value"/> 
     <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Maximum"/> 
     <Binding Source="{StaticResource ProgressBarIndicatorAnimatedFill}"/> 
     <Binding ElementName="Background" Path="ActualWidth"/> 
     <Binding ElementName="Background" Path="ActualHeight"/> 
    </MultiBinding> 
    </Rectangle.OpacityMask> 
</Rectangle> 

... y ha añadido un nuevo multiconversor:

using System; 
using System.Globalization; 
using System.Windows; 
using System.Windows.Data; 
using Microsoft.Windows.Themes; 

namespace [Your namespace here] 
{ 
    public class ProgressBarHighlightOverrideConverter : IMultiValueConverter 
    { 
    private readonly ProgressBarHighlightConverter converter = new ProgressBarHighlightConverter(); 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values[0] == null || values[0] == DependencyProperty.UnsetValue || 
      values[1] == null || values[1] == DependencyProperty.UnsetValue) 
     { 
     return null; 
     } 

     var value = (Double)values[0]; 
     var maximum = (Double)values[1]; 

     return value >= maximum ? null : converter.Convert(new [] {values[2], values[3], values[4]}, targetType, parameter, culture); 
    } 

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

Lo que he hecho efectivamente es reemplazar Microsoft: s ProgressBarHighlightConverter con uno de los míos que vuelve a funcionar el convertidor original si y solo si el valor de la barra de progreso es menor que el de su máximo.