2011-01-19 8 views
19

누구나 WPF-Progressbar의 전경색을 변경하는 방법을 알고 있습니까? 항상 녹색으로 합쳐지는 것 같습니다. 그것이 작동하지 않는 경우 당신이 스타일 또는 ProgressBar의의의 ControlTemplate을 수정해야 할 필요진행 표시 줄 전경색

답변

14

불행하게도, 그것은 하드 기본 스타일로 코딩 :

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

당신은 원래 XAML에서 자신 만의 스타일을 만들거나 예를 들어로드 이벤트에 배경을 재정의 할 시도 할 수 있습니다 :

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

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

하지만 신뢰할 수는 없습니다.

+1

발췌 문장이 작동합니다. 왜 안정적이지 않습니까? 귀하의 답변에 감사드립니다. – Morvader

+0

예, Expression Blend를 사용하여 진행률 표시 줄 템플릿을 편집하는 것이 가장 좋은 방법이지만 코드 숨김 코드는 테스트 및 빠른 개발에 매우 ​​유용합니다. (IMHO) – Morvader

+2

이 솔루션은 Aero 테마와 함께 작동합니다. Animation이라는 요소가 있는지 확인하기 위해 다른 테마를 확인해야합니다. 물론이 문제는 맞춤 템플릿과 함께 나타날 수 있습니다. 또 다른 문제는 테마 전환입니다. 사용자가 OS 테마를 변경할 때 WPF가 컨트롤을 다시로드하는지 여부는 알 수 없습니다. 그렇지 않다면이 순간을 처리하고 애니메이션 배경을 다시 변경해야합니다. 자신 만의 템플릿을 제공하고 싶지 않다면 ProgressBar에서 파생시키는 것이 좋을 것 같습니다. 템플리트가 변경 될 때마다 템플리트 버그를 해결하려면 OnApplyTemplate을 대체해야합니다. –

13

는이

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

으로 시도합니다.

Microsoft의 Expression Blend를 사용하거나 기존 템플릿을 복사하여 수정할 수 있습니다.

+0

당신은 맞습니다. 최고의 옵션을 혼합하는 표현식으로 진행 막대 템플릿을 편집하십시오. 강압을위한 탁구. – Morvader

1

비슷한 문제가 발생했습니다. wh Windows 시각 설정은 최상의 성능 (제어판 -> 시스템 -> 고급 시스템 설정 -> 고급 -> 성능 -> 설정 -> 시각 효과 -> 최상의 성능을 위해 조정)에 맞게 최적화되었습니다. 진행률 표시 줄은 일반 설정에서는 좋았지 만 "최상의 성능"에서는 끔찍했습니다. Foreground를 "LightGreen"으로 변경했습니다. 여기

enter image description here

저는 여기에 최적의 성능을 여기에

enter image description here

조정 때 본 변경

//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"/> 
입니다 무엇을 내가 정상적인 조건에서 기본 데 ForeColor에서 본거야

여기에 내가 최상의 성능을

조정시 이후에 본 무엇

enter image description here

좀 더 자세히 : 원치 않는 녹색 색조 컨트롤 내에서 "애니메이션"라는 개체에서 오는 http://justmycode.blogspot.com.au/2012/08/the-case-of-strangely-coloured.html

1

마랏 Khasanov 지적 주형. 그래서 또 다른 쉬운 접근법은 그 객체를 숨기는 것입니다. 이렇게하면 애니메이션으로 간주되는 "글로우"효과가 비활성화됩니다.이 효과는 자산으로 간주되지만 거래 의사가 될 수 있습니다. 아래 그림과 같이 Loaded 이벤트에 대한 핸들러를 통해이를 구현했습니다.

이것은 an answer to another question에서 영감을 얻었습니다. 동일한주의 사항이 적용됩니다 : 컨트롤 템플릿을 변경하면 더 이상 작동하지 않을 수 있습니다.

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

전체 스타일을 덮어 쓰는 것이 유용하다는 것을 알았습니다. 다음과 같이 나온다

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

로 (일부 서식) 진행 스타일을 모든 컨트롤의 컨트롤 템플릿 스타일을 뽑을 수 :

<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

를 사용하여 스타일과 당신의 요구 사항에 따라 사용자 정의

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

저 저항 경로를 선택하고 인기있는 MahApps 라이브러리를 사용하지 않는 이유는 무엇입니까?

  1. MahApps 라이브러리 가져 오기 : 네임 스페이스 https://www.nuget.org/packages/MahApps.Metro
  2. 설정 : xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"

  3. 추가를 좋아하는 색으로 '전경'설정 'MetroProgressBar'

       <controls:MetroProgressBar Height="40" 
                 Background="{StaticResource GrayBrush2}" 
                 BorderBrush="{StaticResource GrayBrush8}" 
                 BorderThickness="3" 
                 Foreground="{StaticResource GrayBrush8}" 
                 IsIndeterminate="False" 
                 Value="{Binding CurrentProgressInfo.ProgressPercent}" />