2011-01-19 11 views

Respuesta

14

Por desgracia, es difícil codificado en el estilo por defecto:

<Trigger Property="IsIndeterminate" 
    Value="false"> 
<Setter TargetName="Animation" 
    Property="Background" 
    Value="#80B5FFA9"/> 

Usted puede crear su propio estilo de XAML original o tratar de anular fondo en caso Cargado por ejemplo:

private void ProgressBar_Loaded(object sender, RoutedEventArgs e) 
{ 
    var p = (ProgressBar)sender; 
    p.ApplyTemplate(); 

    ((Panel)p.Template.FindName("Animation", p)).Background = Brushes.Red; 
} 

pero no es confiable

+1

Su fragmento funciona. ¿Por qué no es confiable ?. Gracias por tu respuesta. – Morvader

+0

Sí, la mejor opción es editar la plantilla de la barra de progreso con Expression Blend, pero su fragmento de código detrás es muy útil para probar y desarrollar rápidamente. (En mi humilde opinión) – Morvader

+2

Esta solución funciona con el tema Aero. Debería verificar otros temas para asegurarse de que el elemento llamado Animación exista allí. Y, por supuesto, este problema puede aparecer con plantillas personalizadas. Otro problema es el cambio de tema. No sé si WPF vuelve a cargar los controles cuando el usuario cambia el tema del sistema operativo. Si no es así, debes manejar este momento y cambiar el fondo de Animation nuevamente. Si no desea proporcionar su propia plantilla, creo que será bueno derivar de ProgressBar. Allí debe anular OnApplyTemplate para resolver el error de la plantilla cada vez que cambie la plantilla. –

13

acaba de tratar con este

<ProgressBar Height="25" IsIndeterminate="True" Width="150" Foreground="Red" ></ProgressBar> 

Si no está funcionando como se requiere tiene que modificar el estilo o ControlTemplate de Progressbar.

Para hacerlo, puede usar Expression Blend de Microsoft o puede obtener una copia de la plantilla existente y modificarla.

+0

Tiene razón, editando la plantilla de la barra de progreso con la expresión Mezcla es la mejor opción. Thaks por aswering. – Morvader

1

Me encontré con un problema similar wh es que la configuración visual de Windows se optimizó para obtener el mejor rendimiento (Panel de control -> Sistema -> Configuración avanzada del sistema -> Avanzado -> Rendimiento -> Configuración -> Efectos visuales -> Ajustar para obtener el mejor rendimiento). La barra de progreso se veía bien en la configuración normal, pero horrible en "mejor rendimiento". Cambié ForeGround a "LightGreen".

Esto es lo que vi en defecto ForeColor en condiciones normales

enter image description here

Esto es lo que vi cuando ajustada para el mejor rendimiento

enter image description here

Aquí es el cambio

//before 
<ProgressBar Name="Progress" Grid.Column="0" Value="{Binding ProgressValue}" HorizontalAlignment="Stretch"/> 

//after 
<ProgressBar Foreground="LightGreen" Name="Progress" Grid.Column="0" Value="{Binding ProgressValue}" HorizontalAlignment="Stretch"/> 

Aquí es lo que vi después, cuando ajustada para el mejor rendimiento

enter image description here

algo más de detalle: http://justmycode.blogspot.com.au/2012/08/the-case-of-strangely-coloured.html

1

Marat Khasanov señaló que el tinte verde no deseado proviene del objeto denominado "Animación" dentro del control modelo. Entonces, otro enfoque fácil es ocultar ese objeto. Esto también deshabilitará el efecto animado de "resplandor", que considero un activo, pero es posible que vea como un asesino de tratos. Implementé esto a través de un controlador para el evento Loaded como se muestra a continuación.

Esto fue inspirado en an answer to another question. Se aplica la misma advertencia: si cambian la plantilla de control, es posible que ya no funcione.

public void ProgressBar_Loaded(object sender, RoutedEventArgs e) 
    { 
     var progressBar = sender as ProgressBar; 
     if (progressBar == null) return; 

     var animation = progressBar.Template.FindName("Animation", progressBar) as FrameworkElement; 
     if (animation != null) 
      animation.Visibility = Visibility.Collapsed; 

    } 
0

Me pareció bastante útil anular todo el estilo. Puede tirar de los estilos de la plantilla de control de ningún tipo de control con

var yourcontrol = new ProgressBar(); 
// the control needs to load before it has a template. 
yourcontrol.Loaded += (sender,e) => { 
    var str = new System.Text.StringBuilder(); 
    using (var writer = new System.IO.StringWriter(str)) 
     System.Windows.Markup.XamlWriter.Save(yourcontrol .Template, writer); 
    System.Diagnostics.Debug.Write(str); 
}; 
// add it to your main grid, or some control thats loaded on screen. 
gridMain.Children.Add(yourcontrol); 

El estilo progreso (con algo de formato) que sale de la siguiente manera:

<ControlTemplate x:Key="templateprogress" 
        TargetType="ProgressBar"> 
     <Grid Name="TemplateRoot" 
       SnapsToDevicePixels="True"> 
      <Grid.Resources> 

       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="0,1" 
            x:Key="brushMagic1"> 
        <GradientStop Color="#50FFFFFF" 
            Offset="0.5385" /> 
        <GradientStop Color="#00FFFFFF" 
            Offset="0.5385" /> 
       </LinearGradientBrush> 
       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="0,1" 
            x:Key="brushMagic2"> 
        <GradientStop Color="#80FFFFFF" 
            Offset="0.05" /> 
        <GradientStop Color="#00FFFFFF" 
            Offset="0.25" /> 
       </LinearGradientBrush> 
       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="1,0" 
            x:Key="brushGlowRect"> 
        <GradientStop Color="#00FFFFFF" 
            Offset="0" /> 
        <GradientStop Color="#60FFFFFF" 
            Offset="0.4" /> 
        <GradientStop Color="#60FFFFFF" 
            Offset="0.6" /> 
        <GradientStop Color="#00FFFFFF" 
            Offset="1" /> 
       </LinearGradientBrush> 
       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="1,0" 
            x:Key="brushLeftDark"> 
        <GradientStop Color="#0C000000" 
            Offset="0" /> 
        <GradientStop Color="#20000000" 
            Offset="0.3" /> 
        <GradientStop Color="#00000000" 
            Offset="1" /> 
       </LinearGradientBrush> 
       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="1,0" 
            x:Key="brushRightDark"> 
        <GradientStop Color="#00000000" 
            Offset="0" /> 
        <GradientStop Color="#20000000" 
            Offset="0.7" /> 
        <GradientStop Color="#0C000000" 
            Offset="1" /> 
       </LinearGradientBrush> 
       <RadialGradientBrush RadiusX="1" 
            RadiusY="1" 
            x:Key="brushRadialLeftLight" 
            RelativeTransform="1,0,0,1,0.5,0.5"> 
        <GradientStop Color="#60FFFFC4" 
            Offset="0" /> 
        <GradientStop Color="#00FFFFC4" 
            Offset="1" /> 
       </RadialGradientBrush> 
       <LinearGradientBrush StartPoint="0,1" 
            EndPoint="0,0" 
            x:Key="brushCenterLight"> 
        <GradientStop Color="#60FFFFC4" 
            Offset="0" /> 
        <GradientStop Color="#00FFFFC4" 
            Offset="1" /> 
       </LinearGradientBrush> 
       <RadialGradientBrush RadiusX="1" 
            RadiusY="1" 
            x:Key="brushRadial1" 
            RelativeTransform="1,0,0,1,-0.5,0.5"> 
        <GradientStop Color="#60FFFFC4" 
            Offset="0" /> 
        <GradientStop Color="#00FFFFC4" 
            Offset="1" /> 
       </RadialGradientBrush> 
       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="0,1" 
            x:Key="brushHighlight1"> 
        <GradientStop Color="#90FFFFFF" 
            Offset="0.5385" /> 
        <GradientStop Color="#00FFFFFF" 
            Offset="0.5385" /> 
       </LinearGradientBrush> 
       <LinearGradientBrush StartPoint="0,0" 
            EndPoint="0,1" 
            x:Key="brushHighlight2"> 
        <GradientStop Color="#80FFFFFF" 
            Offset="0.05" /> 
        <GradientStop Color="#00FFFFFF" 
            Offset="0.25" /> 
       </LinearGradientBrush> 
      </Grid.Resources> 
      <Rectangle RadiusX="2" 
         RadiusY="2" 
         Fill="{TemplateBinding Panel.Background}" /> 
      <Border CornerRadius="2,2,2,2" 
        Margin="1,1,1,1" 
        Background="{StaticResource ResourceKey=brushMagic1}" /> 
      <Border BorderThickness="1,0,1,1" 
        BorderBrush="#80FFFFFF" 
        Margin="1,1,1,1" 
        Background="{StaticResource ResourceKey=brushMagic2}" /> 
      <Rectangle Name="PART_Track" 
         Margin="1,1,1,1" /> 
      <Decorator Name="PART_Indicator" 
         Margin="1,1,1,1" 
         HorizontalAlignment="Left"> 
       <Grid Name="Foreground"> 
        <Rectangle Fill="{TemplateBinding TextElement.Foreground}" 
           Name="Indicator" /> 
        <Grid Name="Animation" 
          ClipToBounds="True"> 
         <Rectangle Name="PART_GlowRect" 
            Width="100" 
            Margin="-100,0,0,0" 
            HorizontalAlignment="Left" 
            Fill="{StaticResource ResourceKey=brushGlowRect}" /> 
        </Grid> 
        <Grid Name="Overlay"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition MaxWidth="15" /> 
          <ColumnDefinition Width="0.1*" /> 
          <ColumnDefinition MaxWidth="15" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition /> 
          <RowDefinition /> 
         </Grid.RowDefinitions> 
         <Rectangle RadiusX="1" 
            RadiusY="1" 
            Name="LeftDark" 
            Margin="1,1,0,1" 
            Grid.RowSpan="2" 
            Fill="{StaticResource ResourceKey=brushLeftDark}" /> 
         <Rectangle RadiusX="1" 
            RadiusY="1" 
            Name="RightDark" 
            Margin="0,1,1,1" 
            Grid.Column="2" 
            Grid.RowSpan="2" 
            Fill="{StaticResource ResourceKey=brushRightDark}" /> 
         <Rectangle Name="LeftLight" 
            Grid.Column="0" 
            Grid.Row="2" 
            Fill="{StaticResource ResourceKey=brushRadialLeftLight}" /> 
         <Rectangle Name="CenterLight" 
            Grid.Column="1" 
            Grid.Row="2" 
            Fill="{StaticResource ResourceKey=brushCenterLight}" /> 
         <Rectangle Name="RightLight" 
            Grid.Column="2" 
            Grid.Row="2" 
            Fill="{StaticResource ResourceKey=brushRadial1}" /> 
         <Border Name="Highlight1" 
           Grid.ColumnSpan="3" 
           Grid.RowSpan="2" 
           Background="{StaticResource ResourceKey=brushHighlight1}" /> 
         <Border Name="Highlight2" 
           Grid.ColumnSpan="3" 
           Grid.RowSpan="2" 
           Background="{StaticResource ResourceKey=brushHighlight2}" /> 
        </Grid> 
       </Grid> 
      </Decorator> 
      <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
        CornerRadius="2,2,2,2" 
        BorderBrush="{TemplateBinding Border.BorderBrush}" /> 
     </Grid> 
     <ControlTemplate.Triggers> 
      <Trigger Property="ProgressBar.Orientation" 
        Value="Vertical"> 
       <Setter Property="FrameworkElement.LayoutTransform" 
         TargetName="TemplateRoot"> 
        <Setter.Value> 
         <RotateTransform Angle="-90" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="ProgressBar.IsIndeterminate" 
        Value="True"> 
       <Setter Property="UIElement.Visibility" 
         TargetName="LeftDark" 
         Value="Collapsed" /> 
       <Setter Property="UIElement.Visibility" 
         TargetName="RightDark" 
         Value="Collapsed" /> 
       <Setter Property="UIElement.Visibility" 
         TargetName="LeftLight" 
         Value="Collapsed" /> 
       <Setter Property="UIElement.Visibility" 
         TargetName="CenterLight" 
         Value="Collapsed" /> 

       <Setter Property="UIElement.Visibility" 
         TargetName="RightLight" 
         Value="Collapsed" /> 
       <Setter Property="UIElement.Visibility" 
         TargetName="Indicator" 
         Value="Collapsed" /> 
      </Trigger> 
      <Trigger Property="ProgressBar.IsIndeterminate" 
        Value="False"> 
       <Setter Property="Panel.Background" 
         TargetName="Animation" 
         Value="#80B5FFA9" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
    <Style TargetType="ProgressBar"> 
     <Setter Property="Template" 
       Value="{StaticResource ResourceKey=templateprogress}" /> 
    </Style> 
0

Uso estilo y personalizar según el requisito de la suya

     </Border> 

        </DockPanel> 
       </Border> 
        <Border Background="White" Margin="40,0,0,0" Width="1.5" HorizontalAlignment="Left"></Border> 
        <Border Background="White" Margin="80,0,0,0" Width="1.5" HorizontalAlignment="Left"></Border> 
        <Border Background="White" Margin="120,0,0,0" Width="1.5" HorizontalAlignment="Left"></Border> 
        <Border Background="White" Margin="160,0,0,0" Width="1.5" HorizontalAlignment="Left"></Border> 
       </Grid> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 
3

Por qué no tomar un camino de baja resistencia y el uso de la popular MahApps biblioteca?

  1. Obtener la biblioteca MahApps: https://www.nuget.org/packages/MahApps.Metro
  2. Configuración del espacio de nombres: xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"

  3. Añadir el 'MetroProgressBar'

       <controls:MetroProgressBar Height="40" 
                 Background="{StaticResource GrayBrush2}" 
                 BorderBrush="{StaticResource GrayBrush8}" 
                 BorderThickness="3" 
                 Foreground="{StaticResource GrayBrush8}" 
                 IsIndeterminate="False" 
                 Value="{Binding CurrentProgressInfo.ProgressPercent}" /> 
    
  4. Ajuste el 'primer plano' a su color preferido

Cuestiones relacionadas