5

WPF 中的进度条样式是老式的。酒吧的增量。如何实现带有 vista 或 windows-7 阴影发光效果的进度条?

图片 http://quickshare.my3gb.com/download/2.JPG

甚至检查了进度条的属性。但是,没有与发光效果相关的属性。

另外,是否有任何动画或与正常进度条不同的东西/

编辑

编码:

<ProgressBar Height="41" HorizontalAlignment="Left"    Margin="372,215,0,0" Name="progressBar1" VerticalAlignment="Top" Width="150">
            
</ProgressBar>
4

4 回答 4

11

自己滚应该不会太难。

创建一个具有标准进度条属性的用户控件

Value
Maximum
Minimum

您可以创建一个派生属性,该属性使用 a 公式计算条形的大小:

ProgressBarWidth = (Value / (Maximum + Minimum) * ControlWidth) - Padding

更新值、最大值或最小值时会发生变化

将此绑定到进度条控件模板中的“栏”的宽度 - 这样,当 Value 属性更新时,进度条将调整大小。

你的酒吧看起来如何取决于你,但我想你只是想要一堆花哨的填充/渐变/发光效果 - 你可以在 Blend 中添加这些

免责声明:公式可能不正确!

如果您想尝试自己动手,这是我刚刚敲过的一个,它似乎可以正常工作

public partial class MyProgressBar : UserControl
    {
        public MyProgressBar()
        {
            InitializeComponent();

            Loaded += new RoutedEventHandler(MyProgressBar_Loaded);
        }

        void MyProgressBar_Loaded(object sender, RoutedEventArgs e)
        {
            Update();
        }

        private static readonly DependencyProperty MaximumProperty = DependencyProperty.Register("Maximum", typeof(double), typeof(MyProgressBar), new PropertyMetadata(100d, OnMaximumChanged));
        public double Maximum
        {
            get { return (double)GetValue(MaximumProperty); }
            set { SetValue(MaximumProperty, value); }
        }


        private static readonly DependencyProperty MinimumProperty = DependencyProperty.Register("Minimum", typeof(double), typeof(MyProgressBar), new PropertyMetadata(0d, OnMinimumChanged));
        public double Minimum
        {
            get { return (double)GetValue(MinimumProperty); }
            set { SetValue(MinimumProperty, value); }
        }

        private static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(MyProgressBar), new PropertyMetadata(50d, OnValueChanged));
        public double Value
        {
            get { return (double)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }



        private static readonly DependencyProperty ProgressBarWidthProperty = DependencyProperty.Register("ProgressBarWidth", typeof(double), typeof(MyProgressBar), null);
        private double ProgressBarWidth
        {
            get { return (double)GetValue(ProgressBarWidthProperty); }
            set { SetValue(ProgressBarWidthProperty, value); }
        }

        static void OnValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            (o as MyProgressBar).Update();
        }

        static void OnMinimumChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            (o as MyProgressBar).Update();
        }

        static void OnMaximumChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            (o as MyProgressBar).Update();
        }


        void Update()
        {
            // The -2 is for the borders - there are probably better ways of doing this since you
            // may want your template to have variable bits like border width etc which you'd use
            // TemplateBinding for
            ProgressBarWidth = Math.Min((Value / (Maximum + Minimum) * this.ActualWidth) - 2, this.ActualWidth - 2);


        }          
    }

XAML

<UserControl x:Class="WpfApplication1.MyProgressBar"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" x:Name="uc">
    <Grid>
        <Border Background="White">
            <Border BorderBrush="Gray" BorderThickness="1">
                <Grid>
                    <Grid.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FFE5E5E5" Offset="0" />
                            <GradientStop Color="White" Offset="1" />
                        </LinearGradientBrush>
                    </Grid.Background>
                    <Grid Width="{Binding ProgressBarWidth, ElementName=uc}" HorizontalAlignment="Left">
                        <Grid.Background>
                            <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                                <GradientStop Color="#FFCBFFD0" Offset="0" />
                                <GradientStop Color="#FF62EF73" Offset="1" />
                                <GradientStop Color="#FFAEE56D" Offset="0.39" />
                            </LinearGradientBrush>
                        </Grid.Background>
                    </Grid>
                </Grid>
            </Border>
        </Border>
    </Grid>
</UserControl>

结果:

进度条......自产自销!

就像我说的那样,这样的事情很容易,但仍然考虑重新定义模板或使用原始模板,因为它确实支持正确操作系统上的发光

这是在我添加了一个“百分比”依赖属性并绑定到控件模板中之后:

家有号码!

更新代码Percent

   Percentage = Math.Min((int)(Value / (Maximum + Minimum) * 100), 100);

编辑2:

我弄乱了填充并添加了一个白色的内边框,使它看起来更有光泽。唯一缺少的是闪亮的动画

顶部是我的控件,底部是默认的 WPF 之一

请记住,所有这些都可以通过编辑进度条控件模板来实现

哦哦闪亮...

这是更新的 XAML:

<UserControl x:Class="WpfApplication1.MyProgressBar"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" x:Name="uc">
    <Grid>
        <Border Background="White" BorderBrush="Gray" BorderThickness="1">
            <Border BorderBrush="White" BorderThickness="1">
                <Grid>
                    <Grid.Background>
                        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                            <GradientStop Color="#FFE5E5E5" Offset="0" />
                            <GradientStop Color="White" Offset="1" />
                        </LinearGradientBrush>
                    </Grid.Background>
                    <Grid Width="{Binding ProgressBarWidth, ElementName=uc, FallbackValue=200}" HorizontalAlignment="Left">
                        <Grid.Background>
                            <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
                                <GradientStop Color="#FF8BBA91" Offset="0" />
                                <GradientStop Color="#FF8BBA91" Offset="1" />
                                <GradientStop Color="#FF9ED76A" Offset="0.8" />
                                <GradientStop Color="#FF9ED76A" Offset="0.2" />
                            </LinearGradientBrush>
                        </Grid.Background>
                    </Grid>
                    <Border>
                        <Border.Background>
                            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                <GradientStop Color="#89E2E2E2" Offset="0" />
                                <GradientStop Color="#C1FFFFFF" Offset="0.5" />
                                <GradientStop Color="Transparent" Offset="0.52" />
                            </LinearGradientBrush>
                        </Border.Background>
                    </Border>
                    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="{Binding Percentage, ElementName=uc}"></TextBlock>
                </Grid>
            </Border>
        </Border>
    </Grid>
</UserControl>
于 2012-08-15T10:51:39.230 回答
5

您需要在 Windows 的个性化设置中使用 Aero 主题(即 Windows 7 Basic 或 Windows 7),以获得平滑的进度条和动画发光外观。

Vista 和 Windows 7 具有 Aero 主题。它甚至在 Windows XP 发布时都不存在。它还在 Windows 8 中被删除,以获得更标准的外观。如果您切换到 Windows 经典版,那么您会看到旧的粗大条寻找进度条。

WPF 为 Luna、Aero、Royale、Classic 定义了一组不同的模板......它所做的是查看您的系统当前使用的主题,然后决定使用哪一组 WPF 模板。

因此,当您使用 XP 时,它永远没有机会使用 Aero 模板集。

如果出于某种原因,即使 Windows 未使用 Aero 主题,您也希望进度条以 Aero 外观为主题,那么有 2 个主要解决方案。

解决方案:

您可以强制 WPF 应用程序对其所有控件使用以 Aero 为主题的 WPF 模板:

或者

如果您不希望所有应用程序控件都以 Aero 为主题,那么只需从 Aero 主题资源中获取定义 ProgressBar 的 Aero 外观的样式/模板,并将其应用于您的 ProgressBar。

希望任何一种方式都能让您获得发光的进度条....注意,我没有 XP 来测试是否是这种情况。

于 2012-08-15T11:25:58.130 回答
1

您可以使用以下方法模仿动画,这是对已接受答案的调整:

<Grid Background="LightGray">
    <Grid Width="{Binding ProgressBarWidth, ElementName=uc}" HorizontalAlignment="Left">
        <Grid.Triggers>
            <EventTrigger RoutedEvent="Rectangle.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[1].(GradientStop.Offset)" From="-1" To="0" Duration="0:0:1.5" RepeatBehavior="Forever"/>
                        <DoubleAnimation Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[2].(GradientStop.Offset)" From="0" To="1" Duration="0:0:1.5" RepeatBehavior="Forever"/>
                        <DoubleAnimation Storyboard.TargetProperty="Background.(GradientBrush.GradientStops)[3].(GradientStop.Offset)" From="1" To="2" Duration="0:0:1.5" RepeatBehavior="Forever"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Grid.Triggers>
        <Grid.Background>
            <LinearGradientBrush>
                <GradientStop Color="#FF218ED6" Offset="0.0" />
                <GradientStop Color="#FF4BA5E0" Offset="0.4" />
                <GradientStop Color="#FF8ECCF5" Offset="0.5" />
                <GradientStop Color="#FF4BA5E0" Offset="0.6" />
                <GradientStop Color="#FF218ED6" Offset="1.0" />
            </LinearGradientBrush>
        </Grid.Background>
    </Grid>
</Grid>

预览:

在此处输入图像描述

于 2016-04-08T04:53:28.873 回答
0

如果你想改变进度条的外观,你必须重新定义它的(控制)模板。
ms在这里解释了这一点:http:
//msdn.microsoft.com/en-us/library/ms750638.aspx
在编写模板时,要获得发光,您可以使用带有 OuterGlowBitmapEffect 的 BitmapEffect(!软件渲染),但是最好是使用效果(更新)。

如果您使用进度条的效果,也许您不必重新定义模板,它适合您。

请注意,您在网上为您的应用程序提供了很好的免费主题。

于 2012-08-15T10:58:59.130 回答