代码之家  ›  专栏  ›  技术社区  ›  Brandon

WPF/Windows 7:禁用默认进度条发光动画

  •  7
  • Brandon  · 技术社区  · 15 年前

    快速的wpf问题-在wpf中的win 7(我假设是vista),默认的进度条会做一个很好的发光的“whoosh”Y动画。

    我在一个屏幕上显示了大约48个东西的进度,所有这些东西都在你身上,这有点让人难以抗拒——你能在不影响应用程序中其他默认动画的情况下,仅禁用这些动画吗?

    6 回复  |  直到 13 年前
        1
  •  4
  •   Robert Fraser    15 年前

    我同意马修的意见,但无论如何,你的答案是应用一个没有动画的自定义样式。这里是原始样式(通过Reflector),您可以删除/调整/任何:

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

    和转换器类:

    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;
    }
    }
    
        2
  •  10
  •   Mark Cranness    14 年前

    罗伯特的回答很有力。 这里有一个hack(因为它依赖于发光元素的内部名称,这是一个实现细节,可能在后续版本中更改):

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

    如果一个进度条的实现方式改变了,这个黑客可能会停止工作。

    另一方面,完全替换XAML和样式的解决方案可能会锁定并修复颜色、边框等,并禁用将来可能添加到较新版本的ProgressBar中的行为…

        3
  •  6
  •   bohdan_trotsenko    15 年前

    简单的、非动画的进度条可以写成一个网格,其中有两个填充矩形: 左边的颜色是绿色,右边的颜色是灰色。

    网格将有两个列定义。

    更改两个的宽度将产生进度更改的效果。

        4
  •  3
  •   dunecat    15 年前

    您还可以一起在Win7中禁用此效果。

    右键单击桌面上的“我的电脑”图标,然后选择“属性”(或按Windows键+暂停/中断键),单击左侧窗格中的“高级系统设置”链接(也可以通过在“运行”或“开始”菜单搜索框中键入sysdm.cpl并按Enter打开它)。现在单击“性能”部分的“设置”按钮:

    取消选中“动画控件和窗口中的元素”,它应该是第一个选择。

        5
  •  0
  •   Community CDub    8 年前

    不是我的领域,但这个答案也可能是相关的: Disabling progress bar animation on Vista Aero

        6
  •  0
  •   SPrice    13 年前

    创建正在使用的应用程序的快捷方式,右键单击该快捷方式并选择“属性”。 现在,在“兼容性”选项卡中,单击“禁用视觉主题”复选框。

    推荐文章